2008-10-30 5 views
11

Est-il possible de déterminer si un objet est une liste générique? Je ne vais pas connaître le type de la liste, je sais juste que c'est une liste. Comment puis-je déterminer cela?Si l'objet est Liste générique

Répondre

22

Ceci renvoie "True"

List<int> myList = new List<int>(); 

Console.Write(myList.GetType().IsGenericType && myList is IEnumerable); 

-vous soin de savoir si elle est exactement une "liste" ... ou êtes-vous ok avec elle étant IEnumerable, et générique?

+0

Cela ne compile pas actuellement. https://dotnetfiddle.net/T0Q8w3. Peut-être qu'il l'a fait en 2008. – sonicblis

+1

Hey @sonicblis, "IEnumerable" se trouve dans l'espace de noms "System.Collections". Vous n'aviez pas 'using System.Collections;' dans votre violon. Compile encore en 2016 :) –

+0

@ Timothy_Khouri, ah, l'ai. Merci pour le pointeur. – sonicblis

-1

Il existe une fonction GetType() dans la classe System.Object. Avez-vous essayé cela?

+0

événement bien que ce soit peut-être pas une réponse « parfaite », je ne vois pas pourquoi il est marqué moins un.Allez les gars, ce n'est pas la meilleure réponse possible mais essayez de ne pas nuire à la réputation de quelqu'un. –

+0

GetType retournera la liste générique spécifique, contrairement au fait qu'il s'agit simplement d'une liste générique. – Dested

2

Essayez:

if(yourList.GetType().IsGenericType) 
{ 
    var genericTypeParams = yourList.GetType().GetGenericArguments; 
    //do something interesting with the types.. 
} 
7

La méthode suivante renvoie le type d'élément d'un type de collection générique. Si le type n'implémente pas ICollection <> alors null est renvoyé.

static Type GetGenericCollectionItemType(Type type) 
{ 
    if (type.IsGenericType) 
    { 
     var args = type.GetGenericArguments(); 
     if (args.Length == 1 && 
      typeof(ICollection<>).MakeGenericType(args).IsAssignableFrom(type)) 
     { 
      return args[0]; 
     } 
    } 
    return null; 
} 

Edit: La solution ci-dessus suppose que le type spécifié a un paramètre générique de son propre. Cela ne fonctionnera pas pour les types qui mettent en œuvre ICollection <> avec un paramètre générique codé en dur, par exemple:

class PersonCollection : List<Person> {} 

Voici une nouvelle implémentation qui va gérer ce cas.

static Type GetGenericCollectionItemType(Type type) 
{ 
    return type.GetInterfaces() 
     .Where(face => face.IsGenericType && 
         face.GetGenericTypeDefinition() == typeof(ICollection<>)) 
     .Select(face => face.GetGenericArguments()[0]) 
     .FirstOrDefault(); 
} 
0

La question est ambigüe.

La réponse dépend de ce que vous entendez par liste générique.

  • Une liste <UnType>?

  • Une classe qui dérive de la liste <SomeType>?

  • Une classe qui implémente IList <UnType> (dans ce cas, un tableau peut être considéré comme une liste générique - par exemple int [] implémente IList <int>)?

  • Une classe qui est générique et implémente IEnumerable (c'est le test proposé dans le accepted answer)? Mais ceci considérera également la classe plutôt pathologique suivante comme étant une liste générique:

.

public class MyClass<T> : IEnumerable 
{ 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return null; 
    } 
} 

La meilleure solution (par exemple si vous souhaitez utiliser GetType, IsAssignableFrom, etc.) dépendra de ce que vous voulez dire.

1

La réponse acceptée ne garantit pas le type de IList <>. Vérifiez cette version, cela fonctionne pour moi:

private static bool IsList(object value) 
{ 
    var type = value.GetType(); 
    var targetType = typeof (IList<>); 
    return type.GetInterfaces().Any(i => i.IsGenericType 
             && i.GetGenericTypeDefinition() == targetType); 
} 
Questions connexes