C # uzyskiwanie własnej nazwy klasy

464

Jeśli mam klasę o nazwie MyProgram, czy istnieje sposób na pobranie „ MyProgram ” jako ciągu?

deltanovember
źródło

Odpowiedzi:

743

Spróbuj tego:

this.GetType().Name
micahtan
źródło
36
Jeśli używasz metody statycznej, programista wie, jak nazywa się ten typ. Możesz po prostu wpisać go jako ciąg znaków w kodzie źródłowym.
Eric Lippert,
122
@EricLippert: Jeśli wpiszesz nazwę, kompilator nie złapie jej, jeśli zostanie zmieniona nazwa klasy.
Halvard
12
@Halvard: Po pierwsze, jeśli metoda statyczna jest w bieżącym typie, to nazwa jest opcjonalna; jeśli martwisz się, że to się zmieni, pomiń to. Po drugie, Visual Studio automatycznie da ci inteligentny tag, gdy zmienisz nazwę klasy, która zmienia nazwy wszystkich jej instancji. I po trzecie, jeśli zmieniasz nazwę klasy, szanse są dobre, będziesz musiał wprowadzić wiele zmian w wielu miejscach już.
Eric Lippert
12
@EricLippert Masz rację. Każda nowa wersja Visual Studio lub ReSharper wyłapie łańcuchy o tej samej nazwie co nazwa klasy, której nazwa jest zmieniana. Mój poprzedni komentarz to tylko stara, teraz bezużyteczna wiedza ...
Halvard
17
@Halvard: ... aw C # 6 możesz użyć nowego nameofoperatora.
Eric Lippert
238

Chciałem rzucić to na dobrą miarę. Myślę, że preferowany jest sposób wysłania @micahtan .

typeof(MyProgram).Name
ChaosPandion
źródło
24
Jest to w rzeczywistości lepsze, ponieważ: 1. Będzie działać w kontekście statycznym 2. Jest obliczany czas kompilacji, więc nie kosztuje to refleksji
Gilbert
6
@JimBalter Ma wiele zalet: 1. Kontekst statyczny. 2. Część typu nie będzie ponownie oceniana przez CLR za każdym razem - zostanie zapisana w MSIL. 3. Chroni cię przed kimś deklarującym nową „GetType ()”.
Gilbert
11
Jeśli chcesz uzyskać odziedziczoną nazwę klasy, a to wywołanie jest nadrzędne, to nie zadziała.
Gh61
10
Ma to tę wadę, że wymaga wyraźnego odniesienia do typu, co sprawia, że ​​trudniej jest go ponownie użyć.
cprcrack
20
W wersji C # 6.0 lub nowszej możesz to zrobić nameof(MyProgram).
Owen Johnson
190

W wersji C # 6.0 możesz użyć nameofoperatora:

nameof(MyProgram)
Cyanfish
źródło
4
Świetne rzeczy; Działa również z elementami typu (takimi jak metody i właściwości), a nawet zmiennymi - zobacz dokumentację .
mklement0
127

Chociaż odpowiedź micahtana jest dobra, nie zadziała w metodzie statycznej. Jeśli chcesz pobrać nazwę bieżącego typu, ten powinien działać wszędzie:

string className = MethodBase.GetCurrentMethod().DeclaringType.Name;
Thomas Levesque
źródło
2
Niezły chwyt, chociaż myślę, że w tym przypadku preferowana jest moja metoda.
ChaosPandion
5
Nie zadziała to w przypadku metod innych niż wirtualne, ponieważ zwróci nazwę typu, w którym metoda została zadeklarowana i zaimplementowana (ewentualnie w łańcuchu dziedziczenia), a nie konkretny typ instancji, w której faktycznie wykonuje się kod od.
Charles Bretana
1
To wydaje się już nie działać w ramach DNX (Dot Net Execution). Usunęli metodę GetCurrentMethod () i pozostawili tylko GetMethodFromHandle ().
Astaar
Właśnie tego potrzebowałem, aby uzyskać nazwę konkretnej klasy aktualnie wykonującej kod wywoływany z funkcji wirtualnej w potomku.
DrFloyd5
15

Dla odniesienia, jeśli masz typ, który dziedziczy po innym, możesz również użyć

this.GetType().BaseType.Name
mikeschuld
źródło
12

Jeśli potrzebujesz tego w klasach pochodnych, możesz umieścić ten kod w klasie podstawowej:

protected string GetThisClassName() { return this.GetType().Name; }

Następnie możesz dotrzeć do nazwy w klasie pochodnej. Zwraca pochodną nazwę klasy. Oczywiście przy użyciu nowego słowa kluczowego „nameof” nie będzie takiej potrzeby, jak ta odmiana działa.

Poza tym możesz to zdefiniować:

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

A następnie użyj takiego:

public class MyProgram
{
    string thisClassName;

    public MyProgram()
    {
        this.thisClassName = this.NameOf();
    }
}
Bafsar
źródło
10

Użyj tego

Powiedzmy, że Application Test.exe jest uruchomiony, a funkcja to foo () w formularzu 1 [w zasadzie jest to klasa form1 ], wówczas powyższy kod wygeneruje poniżej odpowiedzi.

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

To wróci.

s1 = "TEST.form1"

dla nazwy funkcji:

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

wróci

s1 = foo 

Uwaga: jeśli chcesz użyć tego wyjątku, użyj:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}
Harshal Doshi Jain
źródło
DeclaringType jest zadeklarowany, [Nullable(2)]więc pojawia się ostrzeżenie, gdy aktywne jest sprawdzenie zerowe.
Martin
@Martin, wyjaśnij swój komentarz. Nie rozumiem
NoChance
2

thismożna pominąć. Aby uzyskać aktualną nazwę klasy, wystarczy:

GetType().Name
Mikael Engver
źródło
2

Uzyskaj bieżącą nazwę klasy Asp.net

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();
Abbas Ali
źródło
1
DeclaringType jest zadeklarowany, [Nullable(2)]więc pojawia się ostrzeżenie, gdy aktywne jest sprawdzenie zerowe.
Martin