1

想知道使用“动态”是否是在泛型类型中使用重载的唯一方法。(int)(object) 前缀有点麻烦。

public class TOfTestCase<T> {
    public void otherMethod(int arg1) {

    }

    public void method(T arg1) {
        if (typeof(T) == typeof(int)) {
            otherMethod((int)(object)arg1);
        }
    }
}
4

3 回答 3

2

是的,恐怕是的。您需要有效地欺骗 C# 编译器,使其不尝试寻找更有意义的转换。

就我个人而言,我通常发现,如果一个方法只能处理某些类型,最好有重载而不是一开始就使其成为泛型,但这取决于具体情况。

如果您真的想执行重载(示例代码中没有显示重载,因为每个名称只有一个方法)并且如果您使用的是 C# 4,则可以使用动态类型:

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);
    }
}

当然,如果没有合适的重载,这将在执行时失败。

于 2012-11-05T07:19:05.757 回答
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

于 2012-11-05T07:34:54.557 回答
0

如果您希望它是通用的,这可以是一个选项,否则我同意 Jon 的观点,即重载更干净。

public void method<T>(T arg1) where T : IConvertible
{
    OtherMethod(arg1.ToInt32(CultureInfo.InvariantCulture));
}

在您的情况下,您需要对您的类或此方法的 T1 进行约束。请注意,如果您通过像 1.2 这样的双精度数,则可能会丢失数据。

于 2012-11-05T07:26:50.593 回答