2015-10-28 14 views
5

Chcę oddzielić zmienne IEnumerable według ich typów. Mój kod jest tak:jak uzyskać tylko typ liczby?

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

Gdy używam type.GetType().GetGenericTypeDefinition().Name The listGenericType jest jak List`1 lub HashSet`1 ale chcę go jak List lub HashSet. W związku z tym użyłem Substring do rozwiązania tego problemu!

Czy istnieje sposób rozwiązania tego problemu bez postprocessingu string? Mam na myśli coś w rodzaju poniższego kodu:

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 –

Odpowiedz

5

Nie musisz porównywać tego z ciągiem. Od GetGenericTypeDefinition() Zwraca typu, wszystko co musisz zrobić, to porównać je przeciwko typu za pomocą operatora typeof, jako takich:

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

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

Jak @nopeflow uprzejmie wskazał poniżej, jeśli typ jeśli nie typ rodzajowy następnie GetGenericTypeDefinition() rzuci InvalidOperationException. Upewnij się, że to uwzględniłeś.

+3

To rozgniewał wspomnieć, że jakiś rodzaj może realizować 'IEnumerable' ale ten typ nie jest nazwą rodzajową jeden. (Typ może implementować 'IEnumerable', ale nie' IEnumerable '.... Następnie' GetGenericTypeDefinition' wywoła 'InvalidOperationException'.) – pwas

+0

Dziękuję, zredagowałem moją odpowiedź – kskyriacou

0

Zakładając, że szukasz tylko rodzajów ogólnych, wierzę, że to może ci pomóc.

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