Vielen Dank an @drzaus für seine nette Antwort , die jedoch zu einem Oneliner komprimiert werden kann (plus Überprüfung auf null
s und IEnumerable
Typ):
public static Type GetEnumeratedType(this Type type) =>
type?.GetElementType()
?? typeof(IEnumerable).IsAssignableFrom(type)
? type.GenericTypeArguments.FirstOrDefault()
: null;
Es wurden null
Prüfer hinzugefügt , um Ausnahmen zu vermeiden, vielleicht sollte ich das nicht (zögern Sie nicht, die bedingten Nulloperatoren zu entfernen ). Außerdem wurde ein Filter hinzugefügt, damit die Funktion nur für Sammlungen funktioniert, nicht für generische Typen.
Und denken Sie daran, dass dies auch durch implementierte Unterklassen getäuscht werden könnte, die das Thema der Sammlung ändern, und der Implementierer beschlossen hat, das generische Argument der Sammlung an eine spätere Position zu verschieben.
Konvertierte Antwort für C # 8 und Nullbarkeit:
public static Type GetEnumeratedType(this Type type) =>
((type?.GetElementType() ?? (typeof(IEnumerable).IsAssignableFrom(type)
? type.GenericTypeArguments.FirstOrDefault()
: null))!;