So ermitteln Sie, ob ein Typ einen bestimmten generischen Schnittstellentyp implementiert
Übernehmen die folgenden type-Definitionen:
public interface IFoo<T> : IBar<T> {}
public class Foo<T> : IFoo<T> {}
Wie finde ich heraus, ob der Typ Foo
implementiert die generische Schnittstelle IBar<T>
wenn nur die entstellten Typ verfügbar ist?
InformationsquelleAutor der Frage sduplooy | 2009-02-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mithilfe die Antwort von TcKs es kann auch gemacht werden mit die folgende LINQ-Abfrage:
InformationsquelleAutor der Antwort sduplooy
Müssen Sie gehen bis über die Vererbung von Struktur und finden Sie alle Schnittstellen, die für jede Klasse in den Baum, und vergleichen
typeof(IBar<>)
mit dem Ergebnis des AufrufsType.GetGenericTypeDefinition
wenn die Schnittstelle ist generisch. Es ist alles ein bisschen schmerzhaft, sicherlich.Sehen diese Antwort und diese für mehr info und den code.
InformationsquelleAutor der Antwort Jon Skeet
InformationsquelleAutor der Antwort TcKs
Als Hilfsmethode Erweiterung
Beispiel:
InformationsquelleAutor der Antwort GenericProgrammer
Sie haben zu prüfen, gegen einen konstruierten Typ der generischen Schnittstelle.
Haben Sie etwas wie das hier tun:
weil
IBar<String>
darstellt, konstruierten Typ. Der Grund Sie haben, dies zu tun ist, weil, wennT
ist undefiniert, in den check, den der compiler nicht weiß, ob Sie meineIBar<Int32>
oderIBar<SomethingElse>
.InformationsquelleAutor der Antwort Andrew Hare
Bin ich mit einer etwas einfacheren version von @GenericProgrammers extension Methode:
Verwendung:
InformationsquelleAutor der Antwort Ben Foster
Zunächst
public class Foo : IFoo<T> {}
nicht kompilieren, da müssen Sie eine Klasse anstelle von T, aber nur dann, wenn Sie etwas tun, wiepublic class Foo : IFoo<SomeClass> {}
dann, wenn Sie
InformationsquelleAutor der Antwort Pablo Retyk
Zur Bewältigung der Typ system komplett, ich denke, Sie müssen zu behandeln, Rekursion, z.B.
IList<T>
:ICollection<T>
:IEnumerable<T>
ohne die Sie nicht wüssten, dassIList<int>
letztlich implementiertIEnumerable<>
.InformationsquelleAutor der Antwort Sebastian Good
In den Fall, Sie wollten eine Erweiterung Methode, das generische Basistypen sowie Schnittstellen habe ich ausgebaut sduplooy Antwort:
InformationsquelleAutor der Antwort Philip Pittle
Methode zu überprüfen, ob der Typ erbt oder implementiert einen generischen Typ:
InformationsquelleAutor der Antwort Derek Greer
Sollte eigentlich nichts schief die folgenden:
Für zusätzliche Kredit, den Sie fangen konnten AmbiguousMatchException, wenn Sie wollten, um einen spezifischen generischen Typ-parameter mit Ihren IBar-Abfrage.
InformationsquelleAutor der Antwort mindlace