2014-10-28 128 views
0

所以,我需要調用第三方方法,有這樣的鑄造一個IEnumerable到IEnumerable的<T>與反思

ThirdPartyMethod<T>(IEnumerable<T> items)

我的問題一個簽名,我不知道我的對象的類型在編譯時。

在編譯的時候我有這個

IEnumerable myObject; 
Type typeOfEnumerableIHave; 

Sooo..can反射幫助我在這裏不知何故?

爲了簡單起見,假裝我有這樣

void DoWork(IEnumerable items, Type type) 
{ 
    //In here I have to call ThirdPartyMethod<T>(IEnumerable<T> items); 
} 
+1

在這方面你有這'IEnumerable的myObject的;?'你能表現出一點點你的代碼的 – BrunoLM 2014-10-28 01:05:10

+0

@BrunoLM我加了一點,我不知道這是否會幫助或不 – 2014-10-28 01:09:40

回答

4

的方法既然你有IEnumerable myObject;和簽名像ThirdPartyMethod<T>(IEnumerable<T> items)你能夠使用Cast()

ThirdPartyMethod(myObject.Cast<T>()) 

如果你不知道在編譯時你應該在運行時提供T類型。

考慮一下第三方庫看起來像這樣

public static class External 
{ 
    public static void ThirdPartyMethod<T>(IEnumerable<T> items) 
    { 
     Console.WriteLine(typeof(T).Name); 
    } 
} 

如果你有以下

Type theType = typeof(int); 
IEnumerable myObject = new object[0]; 

你可以在運行時獲得泛型方法ThirdPartyMethodCast

var targetMethod = typeof(External).GetMethod("ThirdPartyMethod", BindingFlags.Static | BindingFlags.Public); 
var targetGenericMethod = targetMethod.MakeGenericMethod(new Type[] { theType }); 

var castMethod = typeof(Enumerable).GetMethod("Cast", BindingFlags.Static | BindingFlags.Public); 
var caxtGenericMethod = castMethod.MakeGenericMethod(new Type[] { theType }); 

最後你打電話給方法:

targetGenericMethod.Invoke(null, new object[] { caxtGenericMethod.Invoke(null, new object[] { myObject }) }); 
+0

我不知道正確的方式來表達呢? ,但我沒有訪問'''',我只有''Type'' ..如果是有道理的 – 2014-10-28 01:10:29

+0

@KyleGobel延長我的答案來說明如何動態地解析泛型方法。 – 2014-10-28 01:37:38

+0

真棒,謝謝,甚至沒有想到用這種反射來稱呼第三方方法 – 2014-10-28 02:09:55

2

你可以嘗試這樣的事:

void DoWork(IEnumerable items, Type type) 
    { 
     // instance of object you want to call 
     var thirdPartyObject = new ThirdPartyObject(); 
     // create a list with type "type" 
     var typeOfList = typeof(List<>).MakeGenericType(type); 
     // create an instance of the list and set items 
     // as constructor parameter 
     var listInstance = Activator.CreateInstance(listOfTypes, items); 
     // call the 3. party method via reflection, make it generic and 
     // provide our list instance as parameter 
     thirdPartyObject.GetType().GetMethod("ThirdPartyMethod") 
      .MakeGenericMethod(type) 
      .Invoke(thirdPartyObject, new []{listInstance});    
    } 

的代碼創建泛型類型的「類型」列表實例(通過使用MakeGenericType)。然後,您的項目元素被複制到列表中,第三方方法是通過雲南財貿稱爲(注意「MakeGenericMethod」調用確保該方法具有相同類型參數作爲方法參數。

相關問題