2010-08-24 54 views
3

可以說,如果我有像下面這樣的情況。如何在編譯時不知道類型的情況下調用泛型函數?


Type somethingType = b.GetType(); 
    // b is an instance of Bar(); 

Foo<somethingType>(); //Compilation error!! 
    //I don't know what is the Type of "something" at compile time to call 
    //like Foo<Bar>(); 


//Where: 
public void Foo<T>() 
{ 
    //impl 
} 

我應該怎樣調用泛型函數不知道在編譯時的類型?

+1

[C#在運行時指定泛型集合類型參數]的可能重複(http://stackoverflow.com/questions/513952/c-specifying-generic-collection-type-param-at-runtime) – Andrey 2010-08-24 09:23:28

+1

任何其他很多。在詢問之前請使用搜索。 – Andrey 2010-08-24 09:23:46

+0

可能的重複[如何使用反射來調用泛型方法?](http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method) – nawfal 2014-01-17 13:34:15

回答

11

你需要使用反射:

MethodInfo methodDefinition = GetType().GetMethod("Foo", new Type[] { }); 
MethodInfo method = methodDefinition.MakeGenericMethod(somethingType); 
method.Invoke(); 

當編寫一個通用的方法,這是很好的做法,提供了一個非通用超載在可能的情況。例如,如果Foo<T>()的作者增加了一個Foo(Type type)重載,則不需要在這裏使用反射。

+0

SWEET !!!得到我的贊成! – Nissim 2010-08-24 09:26:36

+2

只需要更正一次:MethodInfo method = methodDefinition.MakeGenericMethod(somethingType); – Nissim 2010-08-24 09:34:26

+0

謝謝,更正。這個必須經過我的堆棧溢出單元測試套件。 – 2010-08-24 09:49:43

相關問題