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?

Respostas:


743

Tente o seguinte:

this.GetType().Name

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

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


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;

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

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

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

}

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

2

Obter nome da classe atual de Asp.net

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

1
DeclaringType é declarado [Nullable(2)]para que você receba um aviso quando a verificação nula estiver ativa.
Martin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.