C # erhält einen eigenen Klassennamen


464

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

Antworten:


743

Versuche dies:

this.GetType().Name

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

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


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;

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

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();
    }
}

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 );

}

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

2

Aktuellen Klassennamen von Asp.net abrufen

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

1
DeclaringType ist deklariert, [Nullable(2)]sodass Sie eine Warnung erhalten, wenn die Nullprüfung aktiv ist.
Martin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.