2010-11-26 5 views
0

Wie kann ich Reflexion die allgemeinste Art von einem gemeinsamen Konstruktor in der Basisklasse erhalten mit:Speziellere Art von Basis geteilt Konstruktor

Public Class Foo() 
    Shared Sub New() 
     'Here we have code to get the type! 
     MethodBase.GetCurrentMethod().DeclaringType 
    End 
End Class 

Public Class Bar() 
    Inherits Foo 

End Class 

ich das Ergebnis erwarten Bar Typ sein und nicht die Foo. Ist es möglich?

+0

Sie müssen genauer sein. Was ist mit Typen, die Ihre Klasse in einer anderen Baugruppe erben, von der Sie nichts wissen? Was ist, wenn mehrere Typen auf derselben Vererbungsstufe sind? Wie tief den Baum willst du gehen? – thecoop

+1

Yon wollen den * spezifischen * Typ, nicht generisch ... – Lucero

Antwort

2

Erstens, es scheint, dass Sie die meisten abgeleitet Typ (oder die meisten spezifischen Typ) finden wollen, nicht die allgemeinste Art -, die eher das Gegenteil bedeuten würde (entweder, dass Generika beteiligt sind, oder dass die meisten allgemeine Art gesucht wird).

Während es möglich ist, dies mithilfe von Reflektion zu tun, könnte Ihr Bedarf darauf hinweisen, dass Ihr Klassen-Design falsch oder nicht optimal ist.

Erstens, Konstruktoren sind keine virtuellen Methoden, so dass innerhalb eines Konstruktors (IIRC) der Me Objektverweis von dem Typ ist, der diesen Konstruktor enthält.

Sie können über alle Assembly Typen reflektieren und finden Sie alle, die von Foo abgeleitet sind. Sie müssten dann ein Vererbungsdiagramm dieser Typen erstellen und jeder Zahl eine Zahl zuweisen, wie weit sie von Foo (Anzahl der Vererbungsebenen) abgeleitet ist. Sie könnten dann die Me Objektreferenz für alle Typen prüfen, die Sie identifiziert haben (sehen Sie, ob Me für jede von ihnen umgewandelt werden kann), und wählen Sie aus dieser Untergruppe den einen Typ mit der größten Anzahl von Vererbungsstufen aus.

Ich hoffe, dass von diesem werden Sie sehen, dass es die Mühe wahrscheinlich nicht wert ist. Es wäre interessanter und wahrscheinlich hilfreicher, darüber nachzudenken, warum Sie dies tun müssen, und wenn möglich, einen Weg zu finden, dies zu vermeiden.