Comment savoir si un type de l'objet implémentant IEnumerable<X> X dérive de la Base à l'aide de la Réflexion
Donner une classe de base Base
, je veux écrire une méthode Essai, comme ceci:
private static bool Test(IEnumerable enumerable)
{
...
}
tels que le Test renvoie la valeur true si le type de o implémente une interface de IEnumerable<X>
où X
dérive de Base
, de sorte que si je fais ceci:
public static IEnumerable<string> Convert(IEnumerable enumerable)
{
if (Test(enumerable))
{
return enumerable.Cast<Base>().Select(b => b.SomePropertyThatIsString);
}
return enumerable.Cast<object>().Select(o => o.ToString());
}
...que ce serait faire la bonne chose, en utilisant la Réflexion. Je suis sûr que c'est une question de marcher sur toutes les interfaces du type de trouver le premier qui ne correspond pas aux exigences, mais je vais avoir un moment difficile de trouver le générique IEnumerable<>
parmi eux.
Bien sûr, je pourrais considérer ceci:
public static IEnumerable<string> Convert(IEnumerable enumerable)
{
return enumerable.Cast<object>().Select(o => o is Base ? ((Base)o).SomePropertyThatIsString : o.ToString());
}
...mais pensez à cela comme une expérience de pensée.
- Vos extraits de code n'ont pas de sens, d'où le "o" venu?
- Peut-être que vous devriez lire sur les expressions lambda.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez également utiliser un LINQ requête qui pourrait ressembler à ceci.
Ce code suppose que le suivant instructions d'utilisation:
Puisque c'est juste une expérience de pensée. Voici une autre mise en œuvre d'une méthode d'extension.
==
fonctionne uniquement si le type hérite de directement de MyBaseClassVous pouvez utiliser le
Type.FindInterfaces
de filtrer toutes lesIEnumerable<>
interfaces de ce type met en œuvre et vérifier les paramètres génériques (parType.GetGenericArguments
) sur chacun d'eux pour voir si c'estBase
ou hérite deBase
.Mise à jour: Voici un exemple de code:
J'ai écrit un code récemment que doit parcourir toute la collection.
Comme un héritage .NET application, je n'ai même pas de génériques disponibles pour moi!
Voici un extrait :
J'ai trouvé que même l' .NET 1.1 collecte des classes comme SqlParameterCollection ont été IEnumerable.
Il détecte aussi les génériques de collections telles que la Liste des<> comme celles-ci aussi sont IEnumerable.
Espère que cela aide quelqu'un.
objects is IEnumerable
ouobjects as IEnumerable
pour tester si c'est énumérable. Votre solution est assez alambiquée.