2009-07-14 3 views
1

Nehmen wir an, ich habe die folgende Klassenhierarchie: TaskViewer erbt von ListViewer<Task>, die wiederum von ViewerBase erbt.Wie spiegelt sich der generische Parameter, der für die Vererbung verwendet wurde

Wenn ich in eine Methode debuggen, die in ViewerBase deklariert wird und this.GetType() betrachten, gibt es TaskViewer korrekt zurück. Ich kann jedoch keine Eigenschaft oder Methode finden, die mir den generischen Parameter zurückgibt, der bei der Vererbung verwendet wurde, d. H. Task. Offensichtlich, wenn ich im Zusammenhang von TaskViewer oder ListViewer<T> wäre, dann würde ich das leicht wissen.

Ich kann sehen, dass es war Task durch Blick auf die BaseType.FullName Eigenschaft, aber ich habe durch die Liste und nichts, was ich sehen kann, identifiziert sich als dieses generische Argument verwendet.

Wie kann ich den ursprünglichen generischen Parameter innerhalb dieser Methode in der Stammklasse erhalten?

Antwort

6

Sie können auf das generische Argument des Basistyps wie folgt zugreifen (vorausgesetzt, nur ein Argument vom Typ).

typeof(TaskViewer).BaseType.GetGenericArguments()[0] 

In ViewerBase würden Sie

this.GetType().BaseType.GetGenericArguments()[0] 

verwenden, aber es scheint ziemlich weired bei den generischen Typargumente einer abgeleiteten Klasse in der Basisklasse zu suchen. Sie können nicht wissen, wo der tatsächliche Typ ist, also nicht, wenn es überhaupt generische Argumente hat. Können Sie etwas über Ihr Nutzungsszenario erzählen?

+0

Oh. Ich habe es versucht und es gab ein leeres Type-Array vorher zurück, daher habe ich diese Frage gestellt. Ein Umbau und plötzlich gibt es den richtigen Typ zurück! – tags2k

+0

Es ist ein modulbasiertes System. In diesem Fall hat also eine von ViewerBase abgeleitete Klasse irgendwo auf ein Attribut einer statischen Methode gezeigt, das sie als Quelle für ihre Optionsliste verwenden möchte, wenn sie bearbeitet wird. Die Optionen hängen davon ab, was T ist, also muss die statische Methode es wissen. Sie können typeof (T) in einem Attribut nicht übergeben, sodass Strings verwendet werden. Ich schrieb den Teil, der sagt "Wenn es ein T in dieser Zeichenfolge gibt, suche diese Klasse und ihre Basisklasse nach generischen Parametern, die in die Option Quellmethode übernommen werden". Wenn es kein T gibt, dann nenne ich einfach die Methode als normal. Hoffe, das scheint nicht zu komisch! :-D – tags2k

1

Stellen Sie sicher, dass Sie dies aus einem guten Grund tun. Wenn Sie dies tun, um den in einer if-Anweisung zurückgegebenen Typ zurückzugeben und je nach Typ etwas anderes zu tun, ist dies eine Verwendung für Polymorphismus und möglicherweise eine generische Einschränkung, keine Reflexion.

+0

Es ist aus einem guten Grund; Die Basisklasse interessiert sich nicht für den Typ, da er bereits auf die erforderliche Weise eingeschränkt ist. Ich analysiere es tatsächlich, damit ich es in einen Aufruf von MakeGenericMethod() zurückgeben kann. – tags2k

Verwandte Themen