2011-10-20 13 views
31

Duplicar posibles:
.NET: Determine the type of “this” class in its static methodGetType método estático en

¿Cómo puedo hacer GetType() accesible desde un método static?

que tienen esta clase base abstracta

abstract class MyBase 
{ 
    public static void MyMethod() 
    { 
     var myActualType = GetType(); // this is an instance method 
     doSomethingWith(myActualType); 
    } 
} 

y una implementación de dicha clase. (Que podría tener muchas implementaciones.)

class MyImplementation : MyBase 
{ 
    // stuff 
} 

¿Cómo puedo obtener myActualType ser typeof(MyImplementation)?

+3

No creo que pueda hacer esto en una simple cuestión. Una pregunta, ¿por qué querrías esto? El punto con los métodos estáticos es que no necesitan una instancia para ejecutar, ¿verdad? Entonces, ¿por qué es el tipo de materia? Tal vez su problema se puede resolver de una manera completamente diferente. – Alxandr

+1

Estoy intentando escribir un método conveniente para registrar rutas para una aplicación mvc. Estoy intentando restringirlas por espacio de nombres. Es abstracto porque quiero que tu aplicación sea propietaria de la implementación concreta. –

+0

Entonces simplemente no lo escriba como estático, sino como un método en su lugar. Entonces puede obtener fácilmente el tipo mediante 'GetType()'. – Alxandr

Respuesta

2

Este es el patrón que he usado.

abstract class MyBase 
{ 
    public static void MyMethod(Type type) 
    { 
     doSomethingWith(type); 
    } 
} 
35

El "tipo" dentro de un método estático es siempre el tipo específico, ya que no existe un método estático virtual.

En su caso, esto significa que usted puede escribir:

var myActualType = typeof(MyBase); 

Dado que el "tipo" de MyMethod, siendo una estática, es siempre un método estático de MyBase.

+1

Hola, Reed: creo que el problema con tu solución anterior es que 'myActualType' se establecería en el tipo' MyBase', independientemente del tipo de subclase. Si entiendo la pregunta original correctamente, creo que el póster intenta obtener el método 'MyMethod' para usar el tipo de la clase actual. – matt

+2

@ mjd79: Sí, pero ese es mi punto: siempre se tipeará un método estático en el tipo base, ya que un método estático es parte del tipo, no la clase que usa el método ... –

+0

Para aquellos como yo que quiere un equivalente de Java 'MyType.class', esta es la respuesta para usted. –

19

¿Qué tal esto?

abstract class MyBase<T> 
{ 
    public static void MyMethod() 
    { 
     var myActualType = typeof(T); 
     doSomethingWith(myActualType); 
    } 
} 


class MyImplementation : MyBase<MyImplementation> 
{ 
    // stuff 
} 
+4

¿Qué impide que hagas 'clase Bar: MyBase '? –

+0

¡Ah, ese es un punto excelente! Supongo que la convención es lo único que hace que esto funcione, pero tienes razón, si alguien declara la clase de esa manera, el método 'MyMethod' no funcionará como se esperaba. – matt

+3

Podríamos hacer 'donde T: ' según https://msdn.microsoft.com/en-us/library/d5x73970.aspx – John

Cuestiones relacionadas