C # obtendo seu próprio nome de classe

464

Se eu tiver uma classe chamada MyProgram, existe uma maneira de recuperar " MyProgram " como uma string?

deltanovember
fonte

Respostas:

743

Tente o seguinte:

this.GetType().Name
micahtan
fonte
36
Se você estiver usando um método estático, o desenvolvedor saberá qual é o nome do tipo. Você pode apenas digitar como uma string no código fonte.
Eric Lippert
122
@ EricLippert: se você digitar o nome, o compilador não o capturará se a classe for renomeada.
Halvard
12
@ Halvard: Primeiro, se o método estático estiver no tipo atual, o nome é opcional; se você estiver preocupado com a mudança, omita-o. Segundo, o Visual Studio fornecerá automaticamente uma marca inteligente quando você renomeia uma classe que renomeia todas as instâncias dela. E terceiro, se você estiver renomeando uma classe, então as chances são boas de que você já terá que fazer muitas alterações em muitos lugares.
precisa
12
@EricLippert Você está certo. Qualquer nova versão do Visual Studio ou ReSharper captura as seqüências com o mesmo nome da classe que está sendo renomeada. Meu comentário anterior é apenas um velho conhecimento, agora inútil ...
Halvard
17
@ Halvard: ... e em C # 6 você pode usar o novo nameofoperador.
Eric Lippert
238

Eu queria vomitar isso por uma boa medida. Eu acho que a maneira como @micahtan postou é preferida.

typeof(MyProgram).Name
ChaosPandion
fonte
24
Este é realmente melhor, porque: 1. Ele vai trabalhar em contexto estático 2. É tempo de compilação calculado, por isso não custa como reflexão
Gilbert
6
@JimBalter Tem várias vantagens: 1. Contexto estático. 2. A parte do tipo não será reavaliada pelo CLR a cada vez - será gravada no MSIL. 3. Ele protege você de alguém que declara um novo "GetType ()".
Gilbert
11
Se você deseja obter o nome da classe herdada e esta chamada estiver no pai, ela não funcionará.
Gh61
10
Isso tem a desvantagem de precisar fazer referência explicitamente ao tipo, o que o torna menos facilmente reutilizável.
Cprcrack
20
No C # 6.0 ou posterior, você pode fazer nameof(MyProgram).
Owen Johnson
190

Com o C # 6.0, você pode usar o nameofoperador:

nameof(MyProgram)
Cyanfish
fonte
4
Coisas boas; também funciona com membros do tipo (como métodos e propriedades) e até variáveis ​​- consulte a documentação .
usar o seguinte código
127

Embora a resposta do micahtan seja boa, ela não funcionará em um método estático. Se você deseja recuperar o nome do tipo atual, este deve funcionar em qualquer lugar:

string className = MethodBase.GetCurrentMethod().DeclaringType.Name;
Thomas Levesque
fonte
2
Boa captura, embora eu ache que meu método é preferido neste caso.
precisa saber é o seguinte
5
Isso não funcionará para métodos não virtuais, pois retornará o nome do tipo em que o método é declarado e implementado (possivelmente na cadeia de herança), não o tipo concreto da instância em que você está realmente executando o código de.
Charles Bretana
1
Isso parece não funcionar mais na estrutura DNX (Dot Net Execution). Eles removeram o método GetCurrentMethod () e deixaram apenas GetMethodFromHandle ().
Astaar 15/09/2015
Era exatamente isso que eu precisava para obter o nome da classe concreta atualmente executando o código chamado de uma função virtual em um descendente.
DrFloyd5 25/03
15

Para referência, se você tem um tipo que herda de outro, também pode usar

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

Se você precisar disso em classes derivadas, poderá colocar esse código na classe base:

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

Em seguida, você pode alcançar o nome na classe derivada. Retorna o nome da classe derivada. Obviamente, ao usar a nova palavra-chave "nameof", não será necessário que essa variedade atue.

Além disso, você pode definir isso:

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

E então use assim:

public class MyProgram
{
    string thisClassName;

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

Usa isto

Digamos que o Application Test.exe esteja em execução e a função foo () no form1 [basicamente seja a classe form1 ], o código acima gerará uma resposta abaixo.

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

Isso retornará.

s1 = "TEST.form1"

para o nome da função:

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

retornará

s1 = foo 

Observe se você deseja usar isso em exceção, use:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}
Harshal Doshi Jain
fonte
DeclaringType é declarado [Nullable(2)]para que você receba um aviso quando a verificação nula estiver ativa.
Martin
@ Martin, por favor, explique seu comentário. Eu não entendi?
NoChance
2

thispode ser omitida. Tudo o que você precisa para obter o nome da classe atual é:

GetType().Name
Mikael Engver
fonte
2

Obter nome da classe atual de Asp.net

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();
Abbas ali
fonte
1
DeclaringType é declarado [Nullable(2)]para que você receba um aviso quando a verificação nula estiver ativa.
Martin