(type)(object)变量在泛型类中使用重载的唯一方法是什么?

时间:2012-11-05 07:15:37

标签: c# .net

想知道使用“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);
        }
    }
}

3 个答案:

答案 0 :(得分:2)

是的,我很害怕。你需要有效地欺骗C#编译器,而不是试图寻找更有意义的转换。

我个人通常发现如果一个方法只能处理某些类型,那么最好是拥有重载而不是首先使它成为泛型,但它确实取决于具体情况。

如果您真的尝试执行重载(示例代码中没有显示重载,因为每个名称只有一个方法),如果您使用的是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之类的双倍,则可能会导致数据丢失。