2009-02-16 8 views

Respuesta

20
Console.WriteLine(new StackFrame().GetMethod().DeclaringType); 
+4

Como lo señaló @Jamezor, esto podría ser una pesadilla de rendimiento. vítores – systemkern

11

Si bien las respuestas de StackTrace son correctas, tienen una carga. Si simplemente quiere seguridad contra cambiar el nombre, considere typeof(foo).Name. Como los métodos estáticos no pueden ser virtuales, esto generalmente debería ser correcto.

+0

Ese es un buen punto. Obviamente, si controlas el método, entonces controlas el nombre de la clase, por lo que todo es un poco académico. –

+0

Todo lo que estoy usando para esto es registrar un comportamiento excepcional, así puedo vivir con los gastos generales de usar el método de seguimiento de pila ya que la ejecución (probablemente) cesará después de esta actividad de registro. –

+0

este no funcionará si el código se pega a otra clase y se le olvidó que tiene este código –

6

A (limpiador, OMI) alternativa (siendo lento como el infierno y me mobiliario es apropiado si vi esto en una base de código de producción):

Por cierto, si usted está haciendo esto para el registro , algunos frameworks de registro (como log4net) tienen la capacidad incorporada. Y sí, te advierten en los documentos que es una pesadilla potencial de rendimiento.

-3

Como los métodos estáticos no se pueden heredar, el nombre de la clase se conocerá cuando se escriba el método. ¿Por qué no solo codificarlo?

+0

métodos estáticos se pueden heredar difícil., Y si desea llamar al método estático del subclasse no tendría suerte – systemkern

+1

@systemkern - Disculpe, no entendí eso. Incluso si llama al método "a través" de una subclase (como 'SubClass.BaseClassStaticMethod();'), el código real de IL seguirá siendo como lo llamó desde la clase base. Es solo una sintaxis de azúcar por el compilador de C#.No hay forma de 'llamar' a un método 'a través de una subclase', y por lo tanto no hay forma de que el código C# se escriba así. –

+0

Sí, eso es cierto PERO ese podría ser exactamente el punto ; es posible que desee tener un comportamiento ligeramente diferente si llama a SubClassAA.BaseClassStaticMethod() que si llama a SubClassBB.BaseClassStaticMethod(). Esto puede no ser bonito, pero a veces es necesario porque no tienes control total sobre la Subclase ... por "razones" – systemkern

44

usted tiene tres opciones para conseguir el tipo (y por lo tanto el nombre) de YourClass que trabajan en una función estática:

  1. typeof(YourClass) - rápidas (0.043 microsegundos)

  2. MethodBase.GetCurrentMethod().DeclaringType - lento (2.3 microsegundos)

  3. new StackFrame().GetMethod().DeclaringType - más lento (17.2 microsegundos)


Si no se desea usar typeof(YourClass), entonces MethodBase.GetCurrentMethod().DeclaringType es definitivamente la mejor opción.

Cuestiones relacionadas