2015-10-28 6 views
5

Ich möchte IEnumerable Variablen nach ihren Typen trennen. Mein Code ist wie folgt:Wie bekomme ich nur die Art von 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 
    } 
} 

Als ich type.GetType().GetGenericTypeDefinition().Name verwenden, die listGenericType wie List`1 oder HashSet`1 ist, aber ich will es wie List oder HashSet. So habe ich Substring verwendet, um dieses Problem zu behandeln!

Gibt es trotzdem dieses Problem ohne postProcessing string Art zu behandeln? Ich meine etwas wie unten Code:

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 –

Antwort

5

Sie müssen es nicht mit einer Zeichenfolge vergleichen. Da GetGenericTypeDefinition() kehrt ein Typ, alles, was Sie tun müssen, ist es gegen einen Typ vergleichen mit dem typeof Betreiber, wie zum Beispiel:

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

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

Wie @nopeflow freundlich unten wies darauf hin, wenn Ihr Typ, wenn nicht ein generischer Typ dann wird GetGenericTypeDefinition() eine InvalidOperationException werfen. Stellen Sie sicher, dass Sie dies berücksichtigen.

+3

Es ist wroth zu erwähnen, dass irgendeine Art implementieren kann 'IEnumerable' aber dieser Typ ist nicht generisch ein. (Der Typ kann 'IEnumerable' implementieren, aber nicht 'IEnumerable '.... Dann wird' GetGenericTypeDefinition' die Option' InvalidOperationException' auslösen.) – pwas

+0

Vielen Dank, meine Antwort wurde bearbeitet – kskyriacou

0

Angenommen, Sie suchen nur nach generischen Typen, ich glaube, das könnte Ihnen helfen.

  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 
       } 
      } 
Verwandte Themen