Wenn ich eine Klasse namens MyProgram
gibt es eine Möglichkeit, die " MeinProgramm " als Zeichenkette?
@Thomas - Stimmt, obwohl der OP dazu die Reflexion verwenden muss. Dies kann oder kann nicht wichtig sein.
Wenn ich eine Klasse namens MyProgram
gibt es eine Möglichkeit, die " MeinProgramm " als Zeichenkette?
@Thomas - Stimmt, obwohl der OP dazu die Reflexion verwenden muss. Dies kann oder kann nicht wichtig sein.
Können Sie auch eine statische Methode erstellen, die eine Instanz erzeugt und die Eigenschaft Name zurückgibt. Das ist auf jeden Fall einfacher als die Verwendung von Reflection.
Wenn Sie sich in einer statischen Methode befinden, wird die Entwickler weiß, wie der Name des Typs lautet. Sie können ihn einfach als String in den Quellcode eingeben.
Ich wollte das hier nur zur Sicherheit einwerfen. Ich denke, die Art und Weise @micahtan gebucht wird, bevorzugt.
typeof(MyProgram).Name
Das ist eigentlich besser, denn: 1. Es funktioniert im statischen Kontext 2. Es wird zur Kompilierzeit berechnet, kostet also nicht so viel wie Reflection
@Gilbert Dies ist nicht besser als die akzeptierte Antwort von micatan, die unabhängig vom Namen der Klasse funktioniert. Der einzige Vorteil dieser Lösung gegenüber einer einfachen "MyProgram"
ist, dass der Compiler es erkennt, wenn der Name der Klasse geändert wird.
@JimBalter Es hat mehrere Vorteile: 1. Statischer Kontext. 2. Der Typteil wird nicht jedes Mal von der CLR neu ausgewertet - er wird in die MSIL geschrieben. 3. Es schützt Sie davor, dass jemand ein neues "GetType()" deklariert.
Tolles Material; funktioniert auch mit Schrift Mitglieder (wie Methoden und Eigenschaften) und sogar Variablen - siehe die Dokumente .
Dies wird bei nicht-virtuellen Methoden nicht funktionieren, da der Name des Typs zurückgegeben wird, in dem die Methode deklariert und implementiert ist (möglicherweise über die Vererbungskette), und nicht der konkrete Typ der Instanz, von der aus Sie den Code tatsächlich ausführen.
Dies scheint im DNX (Dot Net Execution) Framework nicht mehr zu funktionieren. Sie haben die Methode GetCurrentMethod() entfernt und nur GetMethodFromHandle() übrig gelassen.
Wenn Sie dies in abgeleiteten Klassen benötigen, können Sie den Code in die Basisklasse einfügen:
protected string GetThisClassName() { return this.GetType().Name; }
Dann können Sie den Namen in der abgeleiteten Klasse erreichen. Gibt den Namen der abgeleiteten Klasse zurück. Wenn Sie das neue Schlüsselwort "nameof" verwenden, ist es natürlich nicht erforderlich, dass diese Sorte funktioniert.
Außerdem können Sie dies definieren:
public static class Extension
{
public static string NameOf(this object o)
{
return o.GetType().Name;
}
}
Und dann wie folgt verwenden:
public class MyProgram
{
string thisClassName;
public MyProgram()
{
this.thisClassName = this.NameOf();
}
}
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.