2015-10-28 68 views
5

我想按其類型區分IEnumerable變量。我的代碼是這樣的:如何獲取Enumerable的類型?

if (type is IEnumerable) 
{ 
    var listGenericType = type.GetType().GetGenericTypeDefinition().Name; 
    listGenericType = listGenericType.Substring(0, listGenericType.IndexOf('`')); 
    if (listGenericType == "List") { 
     //do something 
    } 

    else if (listGenericType == "HashSet") { 
     //do something 
    } 
} 

當我使用type.GetType().GetGenericTypeDefinition().Name,在listGenericType就像是List`1HashSet`1但我希望它像ListHashSet。因此,我用Substring來解決這個問題!

反正有沒有後處理string類型來處理這個問題?我的意思是類似於下面的代碼:

if (type is IEnumerable) 
{ 
    var listGenericType = type.GetType().GetGenericTypeDefinitionWithoutAnyNeedForPostProcessing(); 
    if (listGenericType == "List") { 
     //do something 
    } 

    else if (listGenericType == "HashSet") { 
     //do something 
    } 
} 
+1

https://msdn.microsoft.com/en-us/library/system.type.getgenerictypedefinition.aspx –

回答

5

您不必將其與字符串進行比較。由於GetGenericTypeDefinition()回報,所有你需要做的就是使用typeof運營商,它比較對一個類型,例如:

if (type is IEnumerable) 
{ 
    var listGenericType = type.GetType().GetGenericTypeDefinition(); 

    if (listGenericType == typeof(List<>)) { 
     //do something 
    } 
    else if (listGenericType == typeof(HashShet<>)) { 
     //do something 
    } 
} 

由於@nopeflow好心指出如下,如果你的類型,如果不是一個泛型類型那麼GetGenericTypeDefinition()會拋出一個InvalidOperationException。確保你解釋了這一點。

+3

這是怒意一提的是某種可以實現'IEnumerable'但該類型是不通用的。 (該類型可能實現'IEnumerable'而不是'IEnumerable '....然後,'GetGenericTypeDefinition'將拋出'InvalidOperationException'。) – pwas

+0

謝謝,編輯我的答案 – kskyriacou

0

假設你只是在尋找泛型類型,我相信這可能會幫助你。

  List<int> someObject = new List<int>(); 
      Type currentType = someObject.GetType(); 

      if (currentType.IsGenericType) 
      { 
       if (currentType.GetGenericTypeDefinition() == typeof(List<>)) 
       { 
        // Do something 
       } 
       else if (currentType.GetGenericTypeDefinition() == typeof(HashSet<>)) 
       { 
        // Do something else 
       } 
      }