12
votes

Comment obtenir le type contenue dans une collection via la réflexion

Dans une partie de mon code, je suis adopté une collection d'objets de type t code>. Je ne sais pas quelle collée en béton je serai transmise, autre que l'implication ienumerable code>.

au moment de l'exécution, je dois savoir quel type T est (par exemple, System.double code>, system.string code>, etc ...). p>

existe-t-il un moyen de le trouver? P>

Mise à jour : Je devrais peut-être clarifier un peu plus le contexte que je travaille dans (un fournisseur LINQ). p>

Ma fonction a une signature comme ci-dessous, où je reçois le type de la collection comme paramètre : P>

string GetSymbolForType(Type collectionType)
{

}


1 commentaires

Depuis le type de collecte, vous ne pouvez obtenir que le type d'objets contenus dans des collections génériques. Si vous travaillez avec des collections classiques, vous n'aurez pas de bonne chanson ici autre que itérer sur les objets et demandez spécifiquement pour leurs types.


7 Réponses :


0
votes
if(t == typeof(myClass))
{
dosomething();
}
else if (t == typeof(myOtherClass))
{
dosomethingelse();
}

0 commentaires

-1
votes

Vous ne pouvez pas utiliser T.getType () pour le faire.


0 commentaires

-1
votes

Pourquoi pas simplement implémenter un ienumerable à la place? Par exemple:

annulation publique myfunc (iEnumerable objets)

Autre que cela, vous feriez mieux de vérifier le type d'objet individuel à l'aide de est ou .getType plutôt que d'essayer de l'exercer du conteneur lui-même .

Si ce n'est pas une option cependant et que vous devez vraiment connaître le type du conteneur de base, vous devez essentiellement vérifier à l'aide de pour voir quelles interfaces il implémente (par exemple: IList etc.). Les chances sont le type de votre réseau va être un générique, ce qui signifie que vous essayez de revenir de son nom de son type de données sera assez désordonné.


0 commentaires

10
votes
myCollection.GetType().GetGenericArguments() 
will return an array of the type args.

0 commentaires

22
votes

de Blog de Matt Warren :

internal static class TypeSystem {
    internal static Type GetElementType(Type seqType) {
        Type ienum = FindIEnumerable(seqType);
        if (ienum == null) return seqType;
        return ienum.GetGenericArguments()[0];
    }
    private static Type FindIEnumerable(Type seqType) {
        if (seqType == null || seqType == typeof(string))
            return null;
        if (seqType.IsArray)
            return typeof(IEnumerable<>).MakeGenericType(seqType.GetElementType());
        if (seqType.IsGenericType) {
            foreach (Type arg in seqType.GetGenericArguments()) {
                Type ienum = typeof(IEnumerable<>).MakeGenericType(arg);
                if (ienum.IsAssignableFrom(seqType)) {
                    return ienum;
                }
            }
        }
        Type[] ifaces = seqType.GetInterfaces();
        if (ifaces != null && ifaces.Length > 0) {
            foreach (Type iface in ifaces) {
                Type ienum = FindIEnumerable(iface);
                if (ienum != null) return ienum;
            }
        }
        if (seqType.BaseType != null && seqType.BaseType != typeof(object)) {
            return FindIEnumerable(seqType.BaseType);
        }
        return null;
    }
}


0 commentaires

-1
votes

Eh bien, je suis bien en retard ici, mais cela ne devrait-il pas fonctionner:

  public static bool ThatCollectionIsOfType<T>(IEnumerable<T> collection, Type got)
  {
         if (**typeof(T)** == got) //this line should be good to go...
         {
            return true;
         }

   }


0 commentaires

0
votes

J'utilise dynamique beaucoup et c'est un problème de temps à autre.

Matt Davis cloué, mais vous avez besoin de l'index :) p>

public static void PopulateChildCollection<T>(T currentObject, string singlePropertyName)
{
  dynamic currentObjectCollection = ReflectionTools.GetPropertyValue(currentObject, singlePropertyName);
  Type collectionType = currentObjectCollection.GetType().GetGenericArguments()[0];


0 commentaires