2014-11-03 22 views
1

爲什麼我不能做這樣的事情:周圍路過的類型和使用它們作爲類型參數

var myDictionary = new Dictionary<string, Type>(); 

// Add data to dictionary 

foreach(var kvPair in myDictionary) 
{ 
    var result = SomeMethod<kvPair.Value>(kvPair.Key); // Error 
} 

所以我不能用,我有類型的字典元素和類型參數一起使用。是的,我可以將字典發送給SomeMethod(KeyValuePair)。但是,我無法控制功能如何實施。

錯誤:類型或命名空間名稱「kvPair」找不到(是否缺少using指令或程序集引用

我覺得我失去了一些東西很基礎,我不知道?它是什麼。

+0

@JasonP雖然這是一種可能的解決方案,但我認爲將其稱爲重複是一種延伸,因爲在該問題中根本沒有提及泛型。 – 2014-11-03 19:26:05

+0

@JasonP我與DStanley。否則你可以推斷它爲*爲什麼這不起作用?*只是解釋爲什麼它不起作用,這在建議的副本中缺少。這不是重複的,但相關的問題。 – 2014-11-03 19:38:59

回答

3

I feel like I am missing something pretty foundational and I am not sure what it is.

是的,你缺少通用的參數是靜態的,不是動態的他們,不是在運行時發現的。你的情況的一種選擇是使用反射來構建通用的方法調用在運行時:

foreach(var kvPair in myDictionary) 
{ 
    // use reflection to create generic MethodInfo object 
    MethodInfo mi = typeof(this).GetMethod("SomeMethod"); 
    MethodInfo mig = mi.MakeGenericMethod(kvPair.Value); 

    // call generic method 
    Object result = mig.Invoke(this, new object[] {kvPair.Key}); 

    // cast to desired return type. 
} 

然而,在走下這條路之前,我會後退一步,看看仿製藥是否是最好的設計,現在你知道它們沒有遲到。

+0

+1反射解決方案。 – BradleyDotNET 2014-11-03 19:21:28

+0

啊,這個現在很有意義。嗯......我喜歡這個解決方案,它很有趣,但是如果我想用反射來完成這個,我會喜歡它。我將不得不做更多的思考我想要做的事情。謝謝! – Schanckopotamus 2014-11-03 19:32:32