2009-04-27 6 views
54

Was ist der beste Weg zu überprüfen, ob das gegebene Objekt eine Liste ist, oder kann es in eine Liste umgewandelt werden?Wie überprüfe ich, ob ein bestimmter Wert eine generische Liste ist?

+0

Vielleicht finden Sie hier beantworten http://stackoverflow.com/questions/755200/how-do-i-detect-that-an-object: In der Tat kann die ursprüngliche Lösung nur zwei Zeilen reduziert werden -is-a-generic-collection-and-what-types-it-contain –

Antwort

61
if(value is IList && value.GetType().IsGenericType) { 

} 
+0

Dies funktioniert nicht - ich bekomme die folgende Ausnahme - Wert ist IList \t Mit dem generischen Typ 'System.Collections.Generic.IList ' erfordert '1' Argumente –

+6

Sie müssen mit System.Collections; über Ihrer Quelldatei. Die IList-Schnittstelle, die ich vorgeschlagen habe, ist NICHT die generische Version (daher die zweite Überprüfung) –

+1

Sie haben Recht. Das funktioniert wie ein Zauber. Ich habe dies in meinem Watch-Fenster getestet und alles über den fehlenden Namespace vergessen. Ich mag diese Lösung besser, sehr einfach –

1

Wahrscheinlich der beste Weg, um so etwas zu tun wäre:

IList list = value as IList; 

if (list != null) 
{ 
    // use list in here 
} 

Dies wird Ihnen ein Höchstmaß an Flexibilität und ermöglichen es Ihnen auch, mit vielen verschiedenen Arten zu arbeiten, die die IList-Schnittstelle implementieren.

+2

dies überprüft nicht, ob es eine * generische * liste ist wie gefragt. – Lucas

5
if(value is IList && value.GetType().GetGenericArguments().Length > 0) 
{ 

} 
+0

Ich denke, dass Sie einen Aufruf von GetType() benötigen z. value.GetType(). GetGenericArguments(). Länge> 0 – ScottS

+0

Hoppla, du hast Recht. Mein Fehler. – BFree

12
bool isList = o.GetType().IsGenericType 
       && o.GetType().GetGenericTypeDefinition() == typeof(IList<>)); 
4
public bool IsList(object value) { 
    return value is IList 
     || IsGenericList(value); 
} 

public bool IsGenericList(object value) { 
    var type = value.GetType(); 
    return type.IsGenericType 
     && typeof(List<>) == type.GetGenericTypeDefinition(); 
} 
79

für euch, die die Verwendung von Erweiterungsmethoden genießen:

public static bool IsGenericList(this object o) 
{ 
    var oType = o.GetType(); 
    return (oType.IsGenericType && (oType.GetGenericTypeDefinition() == typeof(List<>))); 
} 

So konnten wir tun:

if(o.IsGenericList()) 
{ 
//... 
} 
+1

Für .Net Core muss dies leicht geändert werden, um 'oType.GetTypeInfo() zurückzugeben. IsGenericType && oType.GetGenericTypeDefinition() == typeof (List <>);' –

2

Basierend auf Victor Rodrigues 'Antwort können wir eine andere Methode für Generika entwickeln.

public static bool IsGenericList(this object Value) 
{ 
    var t = Value.GetType(); 
    return t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>); 
} 

public static bool IsGenericList<T>(this object Value) 
{ 
    var t = Value.GetType(); 
    return t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<T>); 
} 
Verwandte Themen