680 Stimmen

C# erhält seinen eigenen Klassennamen

Wenn ich eine Klasse namens MyProgram gibt es eine Möglichkeit, die " MeinProgramm " als Zeichenkette?

1060voto

micahtan Punkte 17264

Versuchen Sie dies:

this.GetType().Name

0 Stimmen

@Thomas - Stimmt, obwohl der OP dazu die Reflexion verwenden muss. Dies kann oder kann nicht wichtig sein.

0 Stimmen

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.

42 Stimmen

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.

305voto

ChaosPandion Punkte 75527

Ich wollte das hier nur zur Sicherheit einwerfen. Ich denke, die Art und Weise @micahtan gebucht wird, bevorzugt.

typeof(MyProgram).Name

38 Stimmen

Das ist eigentlich besser, denn: 1. Es funktioniert im statischen Kontext 2. Es wird zur Kompilierzeit berechnet, kostet also nicht so viel wie Reflection

2 Stimmen

@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.

8 Stimmen

@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.

283voto

Cyanfish Punkte 3497

Mit C# 6.0 können Sie die nameof Betreiber:

nameof(MyProgram)

6 Stimmen

Tolles Material; funktioniert auch mit Schrift Mitglieder (wie Methoden und Eigenschaften) und sogar Variablen - siehe die Dokumente .

146voto

Thomas Levesque Punkte 277723

Obwohl die Antwort von micahtan gut ist, wird sie bei einer statischen Methode nicht funktionieren. Wenn Sie den Namen des aktuellen Typs abrufen möchten, sollte dies überall funktionieren:

string className = MethodBase.GetCurrentMethod().DeclaringType.Name;

3 Stimmen

Schöner Fang, obwohl ich glaube, dass meine Methode in diesem Fall vorzuziehen ist.

5 Stimmen

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.

2 Stimmen

Dies scheint im DNX (Dot Net Execution) Framework nicht mehr zu funktionieren. Sie haben die Methode GetCurrentMethod() entfernt und nur GetMethodFromHandle() übrig gelassen.

21voto

bafsar Punkte 942

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.com

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.

Powered by:

X