Geben Sie eine Basisklasse Base
, ich möchte diese ein Verfahren Prüfung schreiben, wie:Wie findet man heraus, ob ein Objekttyp IEnumerable <X> implementiert, wobei X aus Basis Reflection mit leitet
private static bool Test(IEnumerable enumerable)
{
...
}
, so dass Test ist wahr wenn die Art der o implementiert jede Schnittstelle von IEnumerable<X>
wo X
von Base
leitet, so dass, wenn ich dies tun würde:
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());
}
..., dass es das richtige zu tun, mit Reflecti auf. Ich bin mir sicher, dass es eine Frage des Gehens über alle Schnittstellen des Typs ist, um den ersten zu finden, der den Anforderungen entspricht, aber ich habe eine harte Zeit, den generischen IEnumerable<>
unter ihnen zu finden.
Natürlich, ich könnte dies berücksichtigen:
public static IEnumerable<string> Convert(IEnumerable enumerable)
{
return enumerable.Cast<object>().Select(o => o is Base ? ((Base)o).SomePropertyThatIsString : o.ToString());
}
... aber denken Sie an es als ein Gedankenexperiment.
Ihre Code-Schnipsel machen keinen Sinn, woher kommt "o"? –
Vielleicht sollten Sie sich über Lambda-Ausdrücke informieren. –