Nehmen Sie die folgenden Typdefinitionen an:
public interface IFoo<T> : IBar<T> {}
public class Foo<T> : IFoo<T> {}
Wie finde ich heraus, ob der Typ Foo
die generische Schnittstelle implementiert, IBar<T>
wenn nur der verstümmelte Typ verfügbar ist?
c#
.net
reflection
sduplooy
quelle
quelle
typeof(IBar<,,,>)
mit Kommas, die wie Platzhalter wirkenSie müssen den Vererbungsbaum durchgehen und alle Schnittstellen für jede Klasse im Baum finden und
typeof(IBar<>)
mit dem Ergebnis des Aufrufs vergleichen ,Type.GetGenericTypeDefinition
wenn die Schnittstelle generisch ist. Es ist sicherlich alles ein bisschen schmerzhaft.Weitere Informationen und Code finden Sie in dieser und diesen Antworten .
quelle
quelle
Als Hilfsmethodenerweiterung
Anwendungsbeispiel:
quelle
Ich verwende eine etwas einfachere Version der @ GenericProgrammers-Erweiterungsmethode:
Verwendung:
quelle
Sie müssen gegen einen konstruierten Typ der generischen Schnittstelle prüfen.
Sie müssen so etwas tun:
weil
IBar<String>
repräsentiert diesen konstruierten Typ. Der Grund, warum Sie dies tun müssen, istT
, dass der Compiler nicht weiß, ob SieIBar<Int32>
oder meinen, wenn dies in Ihrer Prüfung nicht definiert istIBar<SomethingElse>
.quelle
Um den Typ System vollständig zu bewältigen, ich glaube , Sie Griff Rekursion benötigen, zB
IList<T>
:ICollection<T>
:IEnumerable<T>
, ohne die Sie nicht wissen , dassIList<int>
letztlich implementiertIEnumerable<>
.quelle
Zunächst
public class Foo : IFoo<T> {}
wird nicht kompiliert, da Sie anstelle von T eine Klasse angeben müssen, sondern davon ausgehen, dass Sie so etwas tunpublic class Foo : IFoo<SomeClass> {}
dann, wenn du es tust
quelle
Für den Fall, dass Sie eine Erweiterungsmethode wünschen, die sowohl generische Basistypen als auch Schnittstellen unterstützt, habe ich die Antwort von sduplooy erweitert:
quelle
Methode zum Überprüfen, ob der Typ einen generischen Typ erbt oder implementiert:
quelle
Versuchen Sie die folgende Erweiterung.
Um es zu testen. erstellen
und die Testmethode
quelle
Folgendes sollte nicht falsch sein:
Als zusätzliche Gutschrift können Sie AmbiguousMatchException abfangen, wenn Sie Ihrer IBar-Abfrage einen bestimmten generischen Typparameter bereitstellen möchten.
quelle
bool implementsGeneric = (anObject.Implements(typeof(IBar<>).Name) != null);