Dans une partie de mon code, je suis adopté une collection d'objets de type au moment de l'exécution, je dois savoir quel type T est (par exemple, 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> t code>. Je ne sais pas quelle collée en béton je serai transmise, autre que l'implication
ienumerable code>.
System.double code>,
system.string code>, etc ...). p>
string GetSymbolForType(Type collectionType)
{
}
7 Réponses :
if(t == typeof(myClass)) { dosomething(); } else if (t == typeof(myOtherClass)) { dosomethingelse(); }
Vous ne pouvez pas utiliser T.getType () pour le faire. P>
Pourquoi pas simplement implémenter un Autre que cela, vous feriez mieux de vérifier le type d'objet individuel à l'aide de 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 code> code> pour voir quelles interfaces il implémente (par exemple: ienumerable
annulation publique myfunc
est code> ou
.getType code> plutôt que d'essayer de l'exercer du conteneur lui-même . p>
IList
myCollection.GetType().GetGenericArguments() will return an array of the type args.
de 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;
}
}
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; } }
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];
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.