En un método no estático que podría usar this.GetType()
y devolvería el Type
. ¿Cómo puedo obtener lo mismo Type
en un método estático? Por supuesto, no puedo simplemente escribir typeof(ThisTypeName)
porque ThisTypeName
solo se conoce en tiempo de ejecución. ¡Gracias!
c#
.net
types
static-methods
Yegor
fuente
fuente
Respuestas:
Si está buscando un forro 1 que sea equivalente a
this.GetType()
los métodos estáticos, intente lo siguiente.Aunque es probable que esto sea mucho más caro que solo usarlo
typeof(TheTypeName)
.fuente
typeof(TheTypeName)
todos modos.Hay algo que las otras respuestas no han aclarado del todo y que es relevante para su idea de que el tipo solo está disponible en el momento de la ejecución.
Si usa un tipo derivado para ejecutar un miembro estático, el nombre del tipo real se omite en el binario. Entonces, por ejemplo, compile este código:
Ahora use ildasm en él ... verá que la llamada se emite así:
El compilador ha resuelto la llamada a
Encoding.GetEncoding
- no queda rastro deUnicodeEncoding
. Eso hace que su idea del "tipo actual" sea absurda, me temo.fuente
Otra solución es utilizar un tipo autorreferencial
Luego, en la clase que lo hereda, hago un tipo de autorreferencia:
Ahora, el tipo de llamada typeof (TSelfReferenceType) dentro de Parent obtendrá y devolverá el tipo de la persona que llama sin la necesidad de una instancia.
-Robar
fuente
No se puede usar
this
en un método estático, por lo que no es posible directamente. Sin embargo, si necesita el tipo de algún objeto, simplemente llámeloGetType
y haga de lathis
instancia un parámetro que debe pasar, por ejemplo:Sin embargo, este parece un diseño deficiente. ¿Estás seguro de que realmente necesitas obtener el tipo de instancia dentro de su propio método estático? Eso parece un poco extraño. ¿Por qué no usar un método de instancia?
fuente
No entiendo por qué no puede usar typeof (ThisTypeName). Si este es un tipo no genérico, entonces esto debería funcionar:
Si es un tipo genérico, entonces:
¿Me estoy perdiendo algo obvio aquí?
fuente
Cuando su miembro es estático, siempre sabrá de qué tipo forma parte en tiempo de ejecución. En este caso:
No puede llamar (editar: aparentemente, puede, vea el comentario a continuación, pero aún estaría llamando a A):
debido a que el miembro es estático, no participa en los escenarios de herencia. Ergo, siempre sabes que el tipo es A.
fuente
Para mis propósitos, me gusta la idea de @ T-moty. Aunque he usado información de "tipo de autorreferencia" durante años, hacer referencia a la clase base es más difícil de hacer más adelante.
Por ejemplo (usando el ejemplo de @Rob Leclerc de arriba):
Trabajar con este patrón puede ser un desafío, por ejemplo; ¿Cómo devuelve la clase base de una llamada a función?
¿O cuando escribe casting?
Entonces, trato de evitarlo cuando puedo y lo uso cuando debo. Si es necesario, le sugiero que siga este patrón:
Ahora puede trabajar (más) fácilmente con
BaseClass
. Sin embargo, hay momentos, como mi situación actual, en los que no es necesario exponer la clase derivada, desde dentro de la clase base, y usar la sugerencia de @ M-moty podría ser el enfoque correcto.Sin embargo, usar el código de @ M-moty solo funciona siempre que la clase base no contenga ningún constructor de instancia en la pila de llamadas. Desafortunadamente, mis clases base usan constructores de instancias.
Por lo tanto, aquí está mi método de extensión que tiene en cuenta los constructores de 'instancia' de la clase base:
fuente
EDITAR Estos métodos funcionarán solo cuando implemente archivos PDB con el ejecutable / biblioteca, como markmnl me señaló.
De lo contrario, será un gran problema para ser detectado: funciona bien en desarrollo, pero tal vez no en producción.
Método de utilidad, simplemente llame al método cuando lo necesite, desde cualquier lugar de su código:
fuente