2011-10-20 19 views
31

Eventuali duplicati:
.NET: Determine the type of “this” class in its static methodGetType a metodo statico

Come posso fare GetType() accessibile da un metodo static?

ho questa classe di base astratta

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

e un'implementazione di quella classe. (Ho potuto avere molte implementazioni.)

class MyImplementation : MyBase 
{ 
    // stuff 
} 

Come posso ottenere myActualType essere typeof(MyImplementation)?

+3

Non penso che si possa fare questo in una questione semplice. Una domanda però, perché vorresti questo? Il punto con i metodi statici è che non hanno bisogno di un'istanza da eseguire, giusto? Allora, perché è il tipo importa? Forse il tuo problema può essere risolto in un modo completamente diverso. – Alxandr

+1

Sto provando a scrivere un metodo comodo per registrare percorsi per un'applicazione mvc - Sto provando a restringerli per namespace. È astratto perché voglio che la tua applicazione sia proprietaria dell'implementazione concreta. –

+0

Quindi non scrivere come statico, ma come metodo. Quindi puoi facilmente ottenere il tipo con 'GetType()'. – Alxandr

risposta

2

Questo è lo schema che ho usato.

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

Il "tipo" all'interno di un metodo statico è sempre il tipo specifico, poiché non esiste un metodo statico virtuale.

Nel vostro caso, questo significa che si può solo scrivere:

var myActualType = typeof(MyBase); 

Dal momento che il "tipo" di MyMethod, essendo statica, è sempre un metodo statico di MyBase.

+1

Ciao Reed - Penso che il problema con la tua soluzione precedente sia che 'myActualType' sia impostato sul tipo' MyBase', indipendentemente dal tipo di sottoclasse. Se capisco correttamente la domanda originale, penso che il poster stia cercando di ottenere il metodo 'MyMethod' per usare il tipo della classe corrente. – matt

+2

@ mjd79: Sì, ma questo è il mio punto: un tipo statico verrà sempre digitato nel tipo di base, poiché un metodo statico fa parte del tipo, non la classe che utilizza il metodo ... –

+0

Per quelli come me che vuoi un equivalente di Java 'MyType.class', questa è la risposta per te. –

19

Che dire di questo?

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


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

Cosa ti impedisce di fare 'class Bar: MyBase '? –

+0

Ah, questo è un punto eccellente! Suppongo che la convenzione sia l'unica cosa che rende questo lavoro, ma hai ragione, se qualcuno dichiara la classe in questo modo, il metodo 'MyMethod' non funzionerà come previsto. – matt

+3

Potremmo fare 'dove T: ' secondo https://msdn.microsoft.com/en-us/library/d5x73970.aspx – John

Problemi correlati