在运行时传递Type参数

时间:2013-02-22 10:38:21

标签: c# type-parameter

代码

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方法有效?

3 个答案:

答案 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