In einer nicht statischen Methode könnte ich verwenden this.GetType()
und es würde die zurückgeben Type
. Wie kann ich dasselbe Type
mit einer statischen Methode erreichen? Natürlich kann ich nicht einfach schreiben, typeof(ThisTypeName)
weil ThisTypeName
es nur zur Laufzeit bekannt ist. Vielen Dank!
c#
.net
types
static-methods
Jegor
quelle
quelle
Antworten:
Wenn Sie nach einem 1-Liner suchen, der
this.GetType()
statischen Methoden entspricht, versuchen Sie Folgendes.Obwohl dies wahrscheinlich viel teurer ist als nur zu verwenden
typeof(TheTypeName)
.quelle
typeof(TheTypeName)
trotzdem darum kümmern .Es gibt etwas, das in den anderen Antworten nicht ganz geklärt ist und das für Ihre Vorstellung relevant ist, dass der Typ nur zur Ausführungszeit verfügbar ist.
Wenn Sie einen abgeleiteten Typ verwenden, um ein statisches Element auszuführen, wird der Name des realen Typs in der Binärdatei weggelassen. Kompilieren Sie beispielsweise diesen Code:
Verwenden Sie jetzt ildasm darauf ... Sie werden sehen, dass der Anruf wie folgt ausgegeben wird:
Der Compiler hat den Aufruf von aufgelöst
Encoding.GetEncoding
- es ist keine SpurUnicodeEncoding
mehr vorhanden. Das macht Ihre Vorstellung von "dem aktuellen Typ" leider unsinnig.quelle
Eine andere Lösung besteht darin, einen selbstreferenzierenden Typ zu verwenden
Dann mache ich in der Klasse, die es erbt, einen selbstreferenzierenden Typ:
Jetzt ruft der Anruftyp typeof (TSelfReferenceType) in Parent den Typ des Anrufers ab und gibt ihn zurück, ohne dass eine Instanz erforderlich ist.
-Rauben
quelle
Sie können nicht
this
in einer statischen Methode verwenden, daher ist dies nicht direkt möglich. Wenn Sie jedoch den Typ eines Objekts benötigen, rufen SieGetType
es einfach auf und machen Sie diethis
Instanz zu einem Parameter, den Sie übergeben müssen, z.Dies scheint jedoch ein schlechtes Design zu sein. Sind Sie sicher, dass Sie den Typ der Instanz selbst wirklich in eine eigene statische Methode integrieren müssen? Das scheint ein bisschen bizarr. Warum nicht einfach eine Instanzmethode verwenden?
quelle
Ich verstehe nicht, warum Sie typeof (ThisTypeName) nicht verwenden können. Wenn dies ein nicht generischer Typ ist, sollte dies funktionieren:
Wenn es sich um einen generischen Typ handelt, dann:
Vermisse ich hier etwas Offensichtliches?
quelle
Wenn Ihr Mitglied statisch ist, wissen Sie zur Laufzeit immer, zu welchem Typ es gehört. In diesem Fall:
Sie können nicht anrufen (bearbeiten: anscheinend können Sie, siehe Kommentar unten, aber Sie würden immer noch in A anrufen):
Da das Mitglied statisch ist, spielt es in Vererbungsszenarien keine Rolle. Ergo wissen Sie immer, dass der Typ A ist.
quelle
Für meine Zwecke mag ich die Idee von @ T-moty. Obwohl ich seit Jahren Informationen zum Typ "Selbstreferenzierend" verwende, ist es später schwieriger, auf die Basisklasse zu verweisen.
Zum Beispiel (am Beispiel von @Rob Leclerc von oben):
Das Arbeiten mit diesem Muster kann beispielsweise eine Herausforderung sein. Wie gibt man die Basisklasse von einem Funktionsaufruf zurück?
Oder beim Typguss?
Also versuche ich es zu vermeiden, wenn ich kann, und benutze es, wenn ich muss. Wenn Sie müssen, würde ich vorschlagen, dass Sie diesem Muster folgen:
Jetzt können Sie (einfacher) mit dem arbeiten
BaseClass
. Es gibt jedoch Zeiten wie in meiner aktuellen Situation, in denen es nicht erforderlich ist, die abgeleitete Klasse innerhalb der Basisklasse verfügbar zu machen, und die Verwendung des Vorschlags von @ M-moty möglicherweise der richtige Ansatz ist.Die Verwendung des Codes von @ M-moty funktioniert jedoch nur, solange die Basisklasse keine Instanzkonstruktoren im Aufrufstapel enthält. Leider verwenden meine Basisklassen Instanzkonstruktoren.
Daher hier meine Erweiterungsmethode, die Instanzkonstruktoren der Basisklasse berücksichtigt:
quelle
BEARBEITEN Diese Methode funktioniert nur, wenn Sie PDB-Dateien mit der ausführbaren Datei / Bibliothek bereitstellen , wie mir markmnl gezeigt hat.
Andernfalls wird ein großes Problem festgestellt: Funktioniert gut in der Entwicklung, aber möglicherweise nicht in der Produktion.
Utility-Methode: Rufen Sie die Methode bei Bedarf einfach an jeder Stelle Ihres Codes auf:
quelle