C # ottiene il proprio nome di classe


464

Se ho una classe chiamata MyProgram, c'è un modo per recuperare " MyProgram " come stringa?

Risposte:


743

Prova questo:

this.GetType().Name

36
Se si utilizza un metodo statico, lo sviluppatore sa qual è il nome del tipo. Puoi semplicemente digitarlo come stringa nel codice sorgente.
Eric Lippert,

122
@EricLippert: se si digita il nome, il compilatore non lo prenderà se la classe viene rinominata.
Halvard,

12
@Halvard: in primo luogo, se il metodo statico è nel tipo corrente, il nome è facoltativo; se sei preoccupato che cambi, omettilo. In secondo luogo, Visual Studio ti darà automaticamente uno smart tag quando rinominerai una classe che rinomina tutte le sue istanze. E in terzo luogo, se stai rinominando una classe, allora le probabilità sono buone che dovrai apportare molte modifiche in molti posti già.
Eric Lippert,

12
@EricLippert Hai ragione. Qualsiasi nuova versione di Visual Studio o ReSharper rileverà le stringhe con lo stesso nome della classe rinominata. Il mio commento precedente è solo una vecchia conoscenza ormai inutile ...
Halvard,

17
@Halvard: ... e in C # 6 puoi usare il nuovo nameofoperatore.
Eric Lippert,

238

Volevo vomitare per buona misura. Penso che sia preferito il modo in cui @micahtan ha pubblicato.

typeof(MyProgram).Name

24
In realtà è meglio, perché: 1. Funzionerà in un contesto statico 2. Viene calcolato il tempo di compilazione, quindi non costa come una riflessione
Gilbert

6
@JimBalter Ha diversi vantaggi: 1. Contesto statico. 2. La parte del tipo non verrà rivalutata dal CLR ogni volta, ma verrà scritta nella MSIL. 3. Ti protegge da qualcuno che dichiara un nuovo "GetType ()".
Gilbert

11
Se vuoi ottenere il nome della classe ereditato e questa chiamata è nel genitore, allora non funzionerà.
Gh61,

10
Questo ha lo svantaggio di dover fare riferimento esplicitamente al tipo, il che lo rende meno facilmente riutilizzabile.
cprcrack,

20
In C # 6.0 o versioni successive puoi farlo nameof(MyProgram).
Owen Johnson,

190

Con C # 6.0, è possibile utilizzare l' nameofoperatore:

nameof(MyProgram)

4
Roba fantastica; funziona anche con i membri del tipo (come metodi e proprietà) e persino con le variabili - vedi i documenti .
mklement0

127

Sebbene la risposta di micahtan sia buona, non funzionerà con un metodo statico. Se vuoi recuperare il nome del tipo corrente, questo dovrebbe funzionare ovunque:

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

2
Bella cattura, anche se penso che il mio metodo sia preferito in questo caso.
ChaosPandion,

5
Questo non funzionerà con metodi non virtuali, poiché restituirà il nome del tipo in cui il metodo è dichiarato e implementato (possibilmente nella catena di ereditarietà), non il tipo concreto dell'istanza in cui si sta effettivamente eseguendo il codice a partire dal.
Charles Bretana,

1
Questo sembra non funzionare più nel framework DNX (Dot Net Execution). Hanno rimosso il metodo GetCurrentMethod () e lasciato solo GetMethodFromHandle ().
Astaar,

Questo è esattamente ciò di cui avevo bisogno per ottenere il nome della classe concreta che attualmente esegue il codice chiamato da una funzione virtuale in un discendente.
DrFloyd5,

15

Per riferimento, se hai un tipo che eredita da un altro puoi anche usare

this.GetType().BaseType.Name

12

Se ne hai bisogno nelle classi derivate, puoi inserire quel codice nella classe base:

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

Quindi, è possibile raggiungere il nome nella classe derivata. Restituisce il nome della classe derivata. Naturalmente, quando si utilizza la nuova parola chiave "nameof", non sarà necessario che questa varietà agisca.

Inoltre puoi definire questo:

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

E quindi utilizzare in questo modo:

public class MyProgram
{
    string thisClassName;

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

10

Usa questo

Supponiamo che Application Test.exe sia in esecuzione e la funzione sia foo () in form1 [sostanzialmente è la classe form1 ], quindi il codice sopra genererà una risposta sotto.

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

Questo tornerà.

s1 = "TEST.form1"

per nome funzione:

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

tornerà

s1 = foo 

Nota se si desidera utilizzare questo in eccezione utilizzare:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}

DeclaringType è dichiarato in [Nullable(2)]modo da ricevere un avviso quando è attivo il controllo null.
Martin,

@Martin, per favore, spiega il tuo commento. Non capisco?
NoChance

2

thispuò essere omesso. Tutto ciò che serve per ottenere il nome della classe corrente è:

GetType().Name

2

Ottieni il nome della classe corrente di Asp.net

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

1
DeclaringType è dichiarato in [Nullable(2)]modo da ricevere un avviso quando è attivo il controllo null.
Martin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.