C # uzyskiwanie własnej nazwy klasy


464

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

Odpowiedzi:


743

Spróbuj tego:

this.GetType().Name

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

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)

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;

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

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

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

}

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

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

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

1
DeclaringType jest zadeklarowany, [Nullable(2)]więc pojawia się ostrzeżenie, gdy aktywne jest sprawdzenie zerowe.
Martin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.