3

代码

public class Test
{
    public int id{get;set;}
    public Type test{get;set;}
}    

public object Convert<T1, T2>()
{ 
    //do stuff        
}

public void DoConvert()
{
    var a = Convert<Test, Test>(); // This Works

    var t = new Test() { test = typeof(Test); }
    var b = Convert<t.test, t.test>(); // This does not work!
}

问题

如上面代码中所述。如何使 Convert 方法在运行时定义 T1 和 T2 的情况下工作?

4

3 回答 3

3

必须进行用户反射才能使用Type.MakeGenericType获得结果。假设Convert方法是静态的并且在Temp类中:

class Temp
{
    public static object Convert<T1, T2>()
    { 
        //do stuff        
    }
}

然后你可以调用:

// assume code to get type1 and type2 dynamically
var type1 = GetGetType1();
var type2 = GetGetType2();

var method =  typeof(Temp).GetMethod("Convert")
                             .MakeGenericMethod(type1, type2);

method.Invoke(null, null);  //assume Convert is static method
于 2013-02-22T10:48:19.107 回答
0

Type.MakeGenericType是你的朋友。你不能像那样在运行时创建泛型类型,你必须使用反射。但是你会失去静态类型,这是你应该注意的。

于 2013-02-22T10:41:05.713 回答
0

如何使 Convert 方法在运行时定义 T1 和 T2 的情况下工作?

反射或运行代码生成是您唯一的选择。

编译代码中的模板必须由编译器解析。因此,您可以像 ASP.NET 那样在运行时创建和编译代码(编译器是运行时的一部分);或者您通过使用反射避免编译(如其他答案所述:Type.MakeGenericType允许您 takeMyType<>和 a Tto get MyType<T>)。

对于通用方法使用MethodInfo.MakeGenericMethod

于 2013-02-22T10:42:48.560 回答