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

Quelle est la meilleure façon de vérifier si l'objet donné est une liste ou peut être converti en liste?Comment vérifier si une valeur donnée est une liste générique?

+0

Peut-être que vous trouvez ici répondre http://stackoverflow.com/questions/755200/how-do-i-detect-that-an-object -is-a-generic-collection-and-what-types-it-contain –

Répondre

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

} 
+0

Cela ne fonctionne pas - Je reçois l'exception suivante - la valeur est IList \t L'utilisation du type générique 'System.Collections.Generic.IList ' requiert des arguments de type '1' –

+6

Vous devez ajouter using System.Collections; au-dessus de votre fichier source. L'interface IList que j'ai suggérée n'est PAS la version générique (d'où la deuxième vérification) –

+1

Vous avez raison. Cela fonctionne comme un charme. Je testais ceci dans ma fenêtre Watch et j'ai tout oublié de l'espace de noms manquant. J'aime mieux cette solution, très simple –

1

Probablement la meilleure façon serait de faire quelque chose comme ceci:

IList list = value as IList; 

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

Cela vous donnera un maximum de flexibilité et vous permettent également de travailler avec de nombreux types différents qui mettent en œuvre l'interface IList.

+2

cela ne vérifie pas si c'est une liste * générique * comme demandé. – Lucas

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

} 
+0

Je pense que vous avez besoin d'un appel à GetType(), par exemple. value.GetType(). GetGenericArguments(). Longueur> 0 – ScottS

+0

Oups, vous avez raison. Mon erreur. – 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

Pour vous les gars qui aiment l'utilisation de méthodes d'extension:

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

Alors, nous pourrions faire:

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

Pour. Net Core cela doit être légèrement modifié pour 'return oType.GetTypeInfo(). IsGenericType && oType.GetGenericTypeDefinition() == typeof (Liste <>);' –

2

Basé sur Victor La réponse de Rodrigues , nous pouvons concevoir une autre méthode pour les génériques. En fait, la solution originale peut être réduite à seulement deux lignes:

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