2009-04-27 6 views
54
public bool IsList(object value) 
    { 
     Type type = value.GetType(); 
     // Check if type is a generic list of any type 
    } 

Qual è il modo migliore per verificare se l'oggetto specificato è un elenco o può essere sottoposto a un elenco?Come posso verificare se un determinato valore è un elenco generico?

+0

Forse a trovare risposta qui http://stackoverflow.com/questions/755200/how-do-i-detect-that-an-object -is-a-generic-collection-and-what-types-it-contain –

risposta

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

} 
+0

Questo non funziona - Ricevo la seguente eccezione: il valore è IList \t L'utilizzo del tipo generico 'System.Collections.Generic.IList ' richiede argomenti tipo '1' –

+6

È necessario aggiungere utilizzando System.Collections; in cima al tuo file sorgente. L'interfaccia IList che ho suggerito NON è la versione generica (da cui il secondo controllo) –

+1

Hai ragione. Funziona come un fascino. Stavo testando questo nella mia finestra di Watch e ho dimenticato tutto lo spazio dei nomi mancante. Mi piace questa soluzione meglio, molto semplice –

1

Probabilmente il modo migliore sarebbe quella di fare qualcosa di simile:

IList list = value as IList; 

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

Questo vi darà la massima flessibilità e permettere anche di lavorare con molti tipi differenti che implementano l'interfaccia IList.

+2

questo non controlla se è un * generico * lista come richiesto. – Lucas

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

} 
+0

Penso che tu abbia bisogno di una chiamata a GetType() ad es. value.GetType(). GetGenericArguments(). Length> 0 – ScottS

+0

Oops, hai ragione. Errore mio. – 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

per voi ragazzi che amano l'uso di metodi di estensione:

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

Così, abbiamo potuto fare:

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

Per .Net Core questo deve essere leggermente modificato per restituire oType.GetTypeInfo(). IsGenericType && oType.GetGenericTypeDefinition() == typeof (Elenco <>); ' –

2

Sulla base di Victor La risposta di Rodrigues , possiamo escogitare un altro metodo per i generici. In realtà, la soluzione originale può essere ridotto a solo due righe:

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