C # obteniendo su propio nombre de clase

464

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

deltanovember
fuente

Respuestas:

743

Prueba esto:

this.GetType().Name
micatan
fuente
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
ChaosPandion
fuente
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
190

Con C # 6.0, puede usar el nameofoperador:

nameof(MyProgram)
Cyanfish
fuente
44
Buena cosa; también funciona con miembros de tipo (como métodos y propiedades) e incluso variables; consulte los documentos .
mklement0
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;
Thomas Levesque
fuente
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
mikeschuld
fuente
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();
    }
}
bafsar
fuente
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 );

}
Harshal Doshi Jain
fuente
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
Mikael Engver
fuente
2

Obtener el nombre de clase actual de Asp.net

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();
Abbas ali
fuente
1
DeclaringType se declara [Nullable(2)]para que reciba una advertencia cuando la comprobación nula esté activa.
Martin