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>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.