2012-11-23 64 views
2

我正在嘗試使用反射來檢測集合,如List<T>。最後,我必須在不使用的情況下進行操作(即通過typeof運算只),並想檢測不僅僅是List<T>集合,但保持它的簡單這裏是失敗的基本測試案例:列表,反射,IEnumerable和配置問題

Type type = (new List<string>()).GetType(); 
if (type.IsAssignableFrom(typeof(System.Collections.IEnumerable))) 
{ 
    Console.WriteLine("True."); 
} 
else Console.WriteLine("False."); 

我也有嘗試IListICollection無濟於事。

雖然疑難解答我遇到下面的討論: Why is List<int> not IEnumerable<ValueType>?

該討論的OP發現他的答案,值類型將不會被像上面,因爲方差不爲他們工作的檢測。但是我使用字符串,一個引用類型,仍然沒有看到協變。更重要的是好奇,(我反正),是當我跑在上面的討論中示例代碼中,我看到一個非常不同的結果:

System.Collections.Generic.List`1[AssignableListTest.Program+X] is most likely a list of ValueTypes or a string 
System.Collections.Generic.List`1[System.String] is most likely a list of ValueTypes or a string 
System.Collections.Generic.List`1[AssignableListTest.Program+Z] is most likely a list of ValueTypes or a string 
System.Collections.Generic.List`1[System.Int32] is most likely a list of ValueTypes or a string 
blah is most likely a list of ValueTypes or a string 
1 is not a list 

導致我相信我一定是從海報的配置差異。我使用的是Visual Studio 2005,在這種情況下是.NET 3.5,儘管如果可能的話我需要兼容性回到2.0。其實,如果我能得到海報的結果,就足夠了(確定IEnumerable已經實現),但是當我用Type.IsAssignableFrom()代替「is」時,它們都會給出「不是列表」。

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

6

你需要翻轉檢查:

type.IsAssignableFrom(typeof(System.Collections.IEnumerable)) 

成爲

typeof(System.Collections.IEnumerable).IsAssignableFrom(type) 

每個人都會這樣的錯誤至少一次。這是一個誤導性的API。

+1

在我個人的'ReflectionUtilities'中,我實際上只創建了兩個方法包裝器,僅僅是'IsAssignableFrom',其中方法/參數名稱使它非常清楚哪個是正因爲如此。 –

+1

很好,謝謝! – Wiley