代码
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!
}
问题
如上面的代码中所述。如何在运行时定义T1和T2的情况下使Convert方法有效?
答案 0 :(得分:3)
您必须用户反射才能获得Type.MakeGenericType的结果。假设Convert
方法是 static 并且在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
答案 1 :(得分:0)
Type.MakeGenericType是你的朋友。你不能在运行时创建泛型类型,你必须使用反射。但是你会失去静态类型,这是你应该注意的事情。
答案 2 :(得分:0)
如何在运行时定义T1和T2的地方使Convert方法有效?
反射或runtume代码生成是您唯一的选择。
编译代码中的模板必须由编译器解析。因此,要么在运行时创建和编译代码(编译器是运行时的一部分),就像ASP.NET所做的那样;或者你通过使用反射来避免编译(作为other answer注释:Type.MakeGenericType允许你采用MyType<>
和T
来获取MyType<T>
。
对于通用方法,请使用MethodInfo.MakeGenericMethod