- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写与我无法更改的外部 API 接口(interface)的代码:
public class ExternalAPI
{
public static void Read(byte[] buffer);
public static void Read(int[] buffer);
public static void Read(float[] buffer);
public static void Read(double[] buffer);
}
在将数据读入buffer
时调用正确的重载方法很重要,但是一旦读入数据,我将对其进行一般处理。我的第一遍代码是:
public class Foo<T>
{
T[] buffer;
public void Stuff()
{
ExternalAPI.Foo(buffer);
}
}
不过,C# 不会将 T[]
转换为 byte[]
。有没有办法枚举 T
可以显式表示的类型?我试过使用 where T :
子句,但似乎没有办法说 where T : {byte, int, float, double and nothing else ever}
?
遵循此处的建议:Generic constraint to match numeric types ,我向泛型添加了约束,还向我的模拟 API 添加了一个泛型方法,该方法采用 object
作为其参数
public class ExternalAPI
{
public static void Read(object buffer);
public static void Read(byte[] buffer);
public static void Read(int[] buffer);
public static void Read(double[] buffer);
}
public class Foo<T> where T: struct, IComparable, IComparable<T>, IConvertible, IEquatable<T>, IFormattable
{
T[] buffer;
public void Stuff()
{
ExternalAPI.Read(buffer);
}
}
这将顺利编译和运行,但唯一被调用的方法是 Foo(object buffer)
,即使 T
是 byte
。当调用类是泛型时,是否有办法强制非泛型类的方法使用最具体的重载?
最佳答案
我以前遇到过这种情况,我想出的唯一解决方案是针对 T
的类型进行测试并调用适当的函数;
public class Foo<T>
{
T[] buffer;
public void Stuff()
{
var type = typeof(T);
if (type == typeof(int[]))
{
...
}
else if (type == typeof(double[]))
{
...
}
}
}
关于c# - 当调用类本身是泛型时,是否可以强制外部类调用专门的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14162977/
我有一个带有模板函数的基类,该函数具有通用模板类型和专用版本。 #ifndef BASE_CLASS #define BASE_CLASS #include using namespace std;
我有这个 3D vector 模板 template class Vec3TYPE{ public: union{ struct{ TYPE x,y,z; }; struct{ TY
我是一名优秀的程序员,十分优秀!