想知道使用“dynamic”是否是在泛型类型中使用重载的唯一方法。 (int)(对象)前缀有点麻烦。
public class TOfTestCase<T> {
public void otherMethod(int arg1) {
}
public void method(T arg1) {
if (typeof(T) == typeof(int)) {
otherMethod((int)(object)arg1);
}
}
}
答案 0 :(得分:2)
我个人通常发现如果一个方法只能处理某些类型,那么最好是拥有重载而不是首先使它成为泛型,但它确实取决于具体情况。
如果您真的尝试执行重载(示例代码中没有显示重载,因为每个名称只有一个方法),如果您使用的是C#4,那么< em>可以使用动态类型:
public class SampleClass<T> {
public void OtherMethod(int arg) {}
public void OtherMethod(string arg) {}
public void OtherMethod(DateTime arg) {}
public void Method(T arg) {
dynamic d = arg;
OtherMethod(d);
}
}
当然,如果没有合适的过载,这将在执行时失败。
答案 1 :(得分:1)
实际上,你可以完全避免装箱/拆箱......
public class TOfTestCase<T> {
public void otherMethod(int arg1) {
}
public void method(T arg1) {
if (typeof(T) == typeof(int)) {
otherMethod(__refvalue(__makeref(arg1), int));
}
}
}
...如果您不介意使用这些关键字。 = P
答案 2 :(得分:0)
如果你想要它是通用的,这可以是一个选项,否则我同意Jon的说法,重载更清晰。
public void method<T>(T arg1) where T : IConvertible
{
OtherMethod(arg1.ToInt32(CultureInfo.InvariantCulture));
}
在你的情况下,你需要你的类的约束或这个方法的T1。 请注意,如果传递1.2之类的双倍,则可能会导致数据丢失。