Nur direkte Schnittstelle statt alle?
Habe ich eine Klasse wie die unten. GetInterfaces() sagt
Wenn der aktuelle Type stellt eine Art
parameter in der definition einer
generischen Typ oder die generische Methode, diese
Methode sucht in der Schnittstelle
Einschränkungen und Schnittstellen
geerbt von Klasse oder Schnittstelle
- Einschränkungen.
Ist es möglich für mich, um nicht alle geerbten Schnittstelle? Wenn ich GetInterfaces auf ABC habe ich nur wollen, um zu sehen, DEF, keine DEF und GHI.
interface DEF : GHI {...}
class ABC : DEF {...}
- Da ich
m only on my iPad I can
t-test-code oder schauen alle Methoden, aber hiers a thought. Could you find all the interfaces your type implements (including inherites ones), then move on to the base type of your type, find all the interfaces *that* type implements, and subtract those from the first set? I would think you would be left with what ABC itself added of interfaces. If anyone wants to "steal" this comment and type up a real answer of it, please do, it won
t werden bis morgen, bis ich wieder an meinem computer. - die GetInterfaces() ist eine Methode der Typ-Klasse.
- Ah, ich entschuldige mich, Ihre "Basis-Typ" ist eine Schnittstelle, dann weiß ich nicht.
- Ich habe verstanden, das problem anders; ich denke, die OP ist nur daran interessiert, interface-Hierarchien.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstens, die MSDN-snippet, das du gepostet hast hat nichts zu tun mit Ihrer wirklichen Frage. Es befasst sich mit, wenn man zum Beispiel ein generischer Typ wie
class Foo<T> where T : IEnumerable
, und Sie versuchen, den AufrufGetInterfaces
auf den Typ-parameterT
werden, zum Beispiel durchtypeof(Foo<>).GetGenericArguments().Single().GetInterfaces().
Zweitens, das problem ist etwas schlecht angegeben. Beachten Sie, dass, wenn eine Klasse eine Schnittstelle implementiert, muss es implementieren alle des interfaces 'geerbt' von der Schnittstelle. Es ist einfach eine C# - Komfort-feature, das können Sie auslassen, die geerbten Schnittstellen in der class-Deklaration. In deinem Beispiel, es ist völlig legal (und nicht anders) zu explizit sind die 'geerbt'
GHI
Schnittstelle:Ich bin davon ausgegangen, dass das, was Sie wirklich wollen, zu tun ist, suchen Sie eine " minimal-set von Schnittstellen, die 'Deckel', die alle vom Typ implementierten Schnittstellen. Dies führt zu einer leicht vereinfachten version der Set cover problem.
Hier ist ein Weg, um es zu lösen, ohne den Versuch überhaupt zu werden algorithmisch effizient. Die Idee zu produzieren, die das minimal-interface-set, die durch das herausfiltern dieser Schnittstellen, die bereits umgesetzt anderen Schnittstellen implementiert, die für den Typ.
(
BEARBEITEN - Hier ist ein besserer Weg, dies zu erreichen:
)
Beispielsweise für
List<int>
:Tun, beachten Sie, dass diese Lösung deckt Schnittstelle 'Hierarchien' nur (das ist, was Sie scheinen zu wollen), nicht, wie Sie beziehen sich auf die Klasse Klasse Hierarchie. Insbesondere, es zahlt keine Aufmerksamkeit auf wo in eine Klasse in der Hierarchie eine Schnittstelle erstmals umgesetzt.
Zum Beispiel, sagen wir, wir haben:
Nun, wenn Sie versucht, mit der Lösung die ich beschrieben habe, um die minimal-interface-set für
Derived
, würden Sie bekommenIBaz
sowieIBar
. Wenn Sie nicht möchten, dassIBar
würden Sie haben zu gehen, um mehr Aufwand: Beseitigung von Schnittstellen implementiert, durch den Basis-Klassen. Der einfachste Weg, dies zu tun wäre, um von der minimal-Schnittstelle-legen Sie diese Schnittstellen implementiert, indem die Klasse der unmittelbaren Basis-Klasse, wie bereits in @MikeEast Antwort.Dies ist ein schönes Stück von einem doppelte Frage:
Und Verwendung:
IList<string>
hatte ich eine ähnliche Lösung auf Basis @lasses KommentarBaseType
Sache. Nicht sehen, dass ein.Den gleichen MSDN-Seite sagt
Nicht So, Sie können nicht überspringen Schnittstellen.
s no concept of "directly implemented" any more. You
ll zu analysieren, die Grafik-Schnittstelle "Vererbung" und finden Sie das plausibelste Ergebnis.Wie über dieses für interface-Vererbung heirachy?
Diese Frage wird dupliziert, beide hier und hier. In jedem Fall, hier ist meine prägnante code der Auffassung, dass die angesprochenen Punkte auf diesen thread von @Ani und @Mikael: