C # erhält einen eigenen Klassennamen

464

Wenn ich eine Klasse namens habe MyProgram, gibt es eine Möglichkeit, " MyProgram " als Zeichenfolge abzurufen ?

deltanovember
quelle

Antworten:

743

Versuche dies:

this.GetType().Name
Micahtan
quelle
36
Wenn Sie sich in einer statischen Methode befinden , weiß der Entwickler , wie der Typ heißt. Sie können es einfach als Zeichenfolge in den Quellcode eingeben.
Eric Lippert
122
@EricLippert: Wenn Sie den Namen eingeben, wird er vom Compiler nicht abgefangen, wenn die Klasse umbenannt wird.
Halvard
12
@Halvard: Wenn die statische Methode vom aktuellen Typ ist, ist der Name optional. Wenn Sie sich Sorgen machen, dass sich etwas ändert, lassen Sie es weg. Zweitens erhalten Sie von Visual Studio automatisch ein Smart Tag, wenn Sie eine Klasse umbenennen, die alle Instanzen davon umbenennt. Und drittens, wenn Sie eine Klasse umbenennen, stehen die Chancen gut, dass Sie bereits an vielen Stellen viele Änderungen vornehmen müssen.
Eric Lippert
12
@EricLippert Du hast recht. Jede neue Version von Visual Studio oder ReSharper erkennt die Zeichenfolgen mit demselben Namen wie die umbenannte Klasse. Mein vorheriger Kommentar ist nur ein altes, jetzt nutzloses Wissen ...
Halvard
17
@Halvard: ... und in C # 6 können Sie den neuen nameofOperator verwenden.
Eric Lippert
238

Ich wollte das für ein gutes Maß werfen. Ich denke, die Art und Weise, wie @micahtan gepostet hat, wird bevorzugt.

typeof(MyProgram).Name
ChaosPandion
quelle
24
Dies ist eigentlich besser, weil: 1. Es wird im statischen Kontext funktionieren 2. Es wird die Kompilierungszeit berechnet, so dass es nicht wie Reflexion kostet
Gilbert
6
@ JimBalter Es hat mehrere Vorteile: 1. Statischer Kontext. 2. Der Typabschnitt wird nicht jedes Mal von der CLR neu bewertet - er wird in die MSIL geschrieben. 3. Es schützt Sie vor jemandem, der einen neuen "GetType ()" deklariert.
Gilbert
11
Wenn Sie einen geerbten Klassennamen erhalten möchten und dieser Aufruf im übergeordneten Element erfolgt, funktioniert er nicht.
Gh61
10
Dies hat den Nachteil, dass der Typ explizit referenziert werden muss, wodurch er weniger leicht wiederverwendbar ist.
Cprcrack
20
In C # 6.0 oder höher können Sie dies tun nameof(MyProgram).
Owen Johnson
190

Mit C # 6.0 können Sie den nameofOperator verwenden:

nameof(MyProgram)
Cyanfisch
quelle
4
Tolles Zeug; funktioniert auch mit Typ - Mitgliedern (wie Methoden und Eigenschaften) und sogar Variablen - siehe die Dokumentation .
mklement0
127

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

string className = MethodBase.GetCurrentMethod().DeclaringType.Name;
Thomas Levesque
quelle
2
Schöner Fang, obwohl ich denke, dass meine Methode in diesem Fall bevorzugt wird.
ChaosPandion
5
Dies funktioniert nicht für nicht virtuelle Methoden, da der Name des Typs zurückgegeben wird, in dem die Methode deklariert und implementiert ist (möglicherweise in der Vererbungskette), und nicht der konkrete Typ der Instanz, in der Sie den Code tatsächlich ausführen von.
Charles Bretana
1
Dies scheint im DNX-Framework (Dot Net Execution) nicht mehr zu funktionieren. Sie haben die GetCurrentMethod () -Methode entfernt und nur GetMethodFromHandle () belassen.
Astaar
Dies ist genau das, was ich brauchte, um den Namen der konkreten Klasse zu erhalten, die gerade Code ausführt, der von einer virtuellen Funktion in einem Nachkommen aufgerufen wurde.
DrFloyd5
15

Wenn Sie einen Typ haben, der von einem anderen erbt, können Sie ihn auch als Referenz verwenden

this.GetType().BaseType.Name
mikeschuld
quelle
12

Wenn Sie dies in abgeleiteten Klassen benötigen, können Sie diesen 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 abgeleiteten Klassennamen zurück. Wenn Sie das neue Schlüsselwort "nameof" verwenden, ist dies natürlich nicht erforderlich.

Außerdem können Sie dies definieren:

public static class Extension
{
    public static string NameOf(this object o)
    {
        return o.GetType().Name;
    }
}

Und dann verwenden Sie wie folgt:

public class MyProgram
{
    string thisClassName;

    public MyProgram()
    {
        this.thisClassName = this.NameOf();
    }
}
bafsar
quelle
10

Benutze das

Angenommen , Application Test.exe wird ausgeführt und die Funktion ist foo () in form1 [im Grunde ist es die Klasse form1 ]. Dann wird der obige Code unter der Antwort generiert.

string s1 = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;

Dies wird zurückkehren.

s1 = "TEST.form1"

für Funktionsname:

string s1 = System.Reflection.MethodBase.GetCurrentMethod().Name;

wird zurückkehren

s1 = foo 

Hinweis, wenn Sie dies in Ausnahmefällen verwenden möchten:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}
Harshal Doshi Jain
quelle
DeclaringType ist deklariert, [Nullable(2)]sodass Sie eine Warnung erhalten, wenn die Nullprüfung aktiv ist.
Martin
@ Martin, bitte erläutern Sie Ihren Kommentar. Ich verstehe es nicht
NoChance
2

thiskann ausgelassen werden. Alles, was Sie brauchen, um den aktuellen Klassennamen zu erhalten, ist:

GetType().Name
Mikael Engver
quelle
2

Aktuellen Klassennamen von Asp.net abrufen

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();
Abbas ali
quelle
1
DeclaringType ist deklariert, [Nullable(2)]sodass Sie eine Warnung erhalten, wenn die Nullprüfung aktiv ist.
Martin