2012-04-27 85 views
4

我想根據給定的集合類型(使用反射)進行一些操作,而不考慮泛型類型。通用集合類型測試

這裏是我的代碼:

void MyFct(Type a_type) 
    { 
     // Check if it's type of List<> 
     if (a_type.Name == "List`1") 
     { 
      // Do stuff 
     } 
     // Check if it's type of Dictionary<,> 
     else if (a_type.Name == "Dictionary`2") 
     { 
      // Do stuff 
     } 
    } 

它適用於現在,但它得到明顯,我認爲它不是最安全的解決方案。

void MyFct(Type a_type) 
    { 
     // Check if it's type of List<> 
     if (a_type == typeof(List<>)) 
     { 
      // Do stuff 
     } 
     // Check if it's type of Dictionary<,> 
     else if (a_type == typeof(Dictionary<,>)) 
     { 
      // Do stuff 
     } 
    } 

我試過太多,它actualy編譯,但沒有工作... 我也試圖測試給出集合類型的所有接口,但它在集合意味着排他性的接口...

我希望我自己清楚,我的英語缺乏培訓:)

+0

做'a_type.ToString()。'它說什麼? – 2012-04-27 18:04:16

+1

我懷疑你正試圖解決錯誤的問題。向泛型代碼添加特定於類型的檢查是很臭的。 – n8wrl 2012-04-27 18:04:50

+0

* a_type.ToString()=> System.Collections.Generic.List'1 [MyClass] – s0ubap 2012-04-27 18:08:57

回答

8

如果你想看看是否有實現特定泛型類型,那麼你就必須這樣做:

if(a_type.IsGenericType && a_type.GetGenericTypeDefinition() == typeof(List<>)) 

GetGenericTypeDefinition()方法將返回您測試的無界泛型類型。

+0

謝謝!這正是我需要的。我想我太快閱讀文檔了... – s0ubap 2012-04-27 18:18:06