C # obteniendo su propio nombre de clase


464

Si tengo una clase llamada MyProgram, ¿hay alguna forma de recuperar " MyProgram " como una cadena?

Respuestas:


743

Prueba esto:

this.GetType().Name

36
Si utiliza un método estático, el desarrollador sabe cuál es el nombre del tipo. Simplemente puede escribirlo como una cadena en el código fuente.
Eric Lippert

122
@EricLippert: si escribe el nombre, el compilador no lo detectará si se cambia el nombre de la clase.
Halvard

12
@Halvard: Primero, si el método estático está en el tipo actual, entonces el nombre es opcional; Si le preocupa que cambie, omítalo. En segundo lugar, Visual Studio le dará automáticamente una etiqueta inteligente cuando cambie el nombre de una clase que cambie el nombre de todas las instancias de la misma. Y tercero, si está cambiando el nombre de una clase, entonces las probabilidades son buenas, ya tendrá que hacer muchos cambios en muchos lugares.
Eric Lippert

12
@EricLippert Tienes razón. Cualquier versión nueva de Visual Studio o ReSharper capturará las cadenas con el mismo nombre que la clase que se renombra. Mi comentario anterior es solo un conocimiento viejo e inútil ...
Halvard

17
@Halvard: ... y en C # 6 puedes usar el nuevo nameofoperador.
Eric Lippert

238

Quería vomitar esto por si acaso. Creo que se prefiere la forma en que @micahtan publicó.

typeof(MyProgram).Name

24
Esto es realmente mejor, porque: 1. Funcionará en contexto estático 2. Es tiempo de compilación calculado, por lo que no cuesta como la reflexión
Gilbert

66
@ JimBalter Tiene múltiples ventajas: 1. Contexto estático. 2. La parte de tipo no será reevaluada por el CLR cada vez, sino que se escribirá en el MSIL. 3. Te protege de que alguien declare un nuevo "GetType ()".
Gilbert

11
Si desea obtener el nombre de clase heredado y esta llamada está en el padre, entonces no funcionará.
Gh61

10
Esto tiene la desventaja de tener que hacer referencia explícita al tipo, lo que lo hace menos fácil de reutilizar.
cprcrack

20
En C # 6.0 o posterior puedes hacerlo nameof(MyProgram).
Owen Johnson el


127

Aunque la respuesta de micahtan es buena, no funcionará en un método estático. Si desea recuperar el nombre del tipo actual, este debería funcionar en todas partes:

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

2
Buena captura, aunque creo que mi método es el preferido en este caso.
ChaosPandion

55
Esto no funcionará para métodos no virtuales, ya que devolverá el nombre del tipo en el que se declara e implementa el método (posiblemente en la cadena de herencia), no el tipo concreto de la instancia en la que realmente está ejecutando el código desde.
Charles Bretana

1
Esto ya no parece funcionar en el marco DNX (Dot Net Execution). Quitaron el método GetCurrentMethod () y dejaron solo GetMethodFromHandle ().
Astaar

Esto es exactamente lo que necesitaba para obtener el nombre de la clase concreta que actualmente ejecuta el código llamado desde una función virtual en un descendiente.
DrFloyd5

15

Como referencia, si tiene un tipo que hereda de otro, también puede usar

this.GetType().BaseType.Name

12

Si necesita esto en clases derivadas, puede poner ese código en la clase base:

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

Luego, puede alcanzar el nombre en la clase derivada. Devuelve el nombre de la clase derivada. Por supuesto, cuando se usa la nueva palabra clave "nameof", no habrá necesidad de que esta variedad actúe.

Además puedes definir esto:

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

Y luego use así:

public class MyProgram
{
    string thisClassName;

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

10

Utilizar este

Digamos que Application Test.exe se está ejecutando y la función es foo () en form1 [básicamente es class form1 ], luego el código anterior generará la respuesta siguiente.

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

Esto volverá

s1 = "TEST.form1"

para el nombre de la función:

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

volverá

s1 = foo 

Tenga en cuenta que si desea usar esto en excepción, use:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}

DeclaringType se declara [Nullable(2)]para que reciba una advertencia cuando la comprobación nula esté activa.
Martin

@ Martin, por favor explique su comentario. No lo entiendo?
Posibilidad

2

thispuede ser omitido. Todo lo que necesita para obtener el nombre de clase actual es:

GetType().Name

2

Obtener el nombre de clase actual de Asp.net

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

1
DeclaringType se declara [Nullable(2)]para que reciba una advertencia cuando la comprobación nula esté activa.
Martin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.