2013-02-22 81 views
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的地方工作?

回答

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 
+0

Nevermind,managed現在就試試吧! – 2013-02-22 10:51:23

+0

@TheunArbeider:更新了我的安裝程序 – 2013-02-22 10:54:56

+0

這似乎是工作,因爲我希望它!非常感謝! – 2013-02-22 11:02:42

0

Type.MakeGenericType這裏是你的朋友。你不能像運行時那樣創建泛型類型,你必須使用反射。但是,那麼你會失去靜態類型,這是你應該知道的。

+0

護理給予〔實施例。它一直告訴我「無法找到類型或命名空間名稱't.test'(你是否缺少使用指令或程序集引用?)即使當我嘗試var c = t.test.MakeGenericType() – 2013-02-22 10:47:13

0

如何讓Convert方法在運行時定義T1和T2的地方工作?

反射或runtume代碼生成是你唯一的選擇。在編譯的代碼

模板必須由編譯器來解決。因此,無論是在運行時創建和編譯代碼(編譯器都是運行時的一部分),就像ASP.NET所做的那樣;或者您避免編譯使用反射(如other answer說明:Type.MakeGenericType允許你採取MyType<>T得到MyType<T>)。

對於泛型方法使用MethodInfo.MakeGenericMethod

相關問題