2012-04-02 18 views
5

Tengo tres clases: ClassA, ClassB, ClassC.GetType() devuelve la clase de subclase en el constructor de la superclase

ClassC se extiende ClassB que a su vez se extiende ClassA.

Cuando llamo GetType() desde el constructor ClassA, .net devuelve el tipo ClassC. Estoy desconcertado porque esto está sucediendo en un código que ha estado funcionando por un tiempo y que no he tocado en mucho tiempo. ¿Hubo una revisión de .net que cambió el comportamiento de GetType()? Dudo que. Mi único otro pensamiento es que esto tiene algo que ver con xUnit, el marco de prueba que estoy usando.

+0

todo - gracias! todos parecen decir lo mismo ... que esto está funcionando como se esperaba y como siempre. – SFun28

Respuesta

12

Se comporta exactamente como se supone que debe. GetType() devuelve el tipo real de la instancia del objeto, incluso si es una subclase (y tiene siempre se comportó de esta manera). typeof(ClassA) por el contrario siempre se le daría el tipo de ClassA.

+0

extraño ... No estoy seguro de cómo habrían pasado las pruebas de mi unidad. De todos modos, parece que debería estar usando typeof() – SFun28

2

Si entiendo bien su problema, tiene un tipo ClassA a, y al llamarlo obtiene ClassC. Si es así, lo más probabbly no un objeto real, ClassA pero es algo como esto:

En alguna parte del código que tiene una inicialización como la siguiente:

ClassA a = new ClassC().

Teniendo en cuenta que ClassC : ClassB y ClassB : ClassA usted puede hacer eso.

GetType() devuelve real tipo de objeto y tipo de envoltorio no real.

1

Por lo que yo puedo recordar, GetType() siempre ha devuelto el tipo de la instancia, no es la clase base, independientemente de donde se llama.

2

La función GetType se comporta como se esperaba. Siempre debe devolver el tipo de tiempo de ejecución real del valor. No creo que ningún parche caliente haya cambiado este comportamiento, pero el comportamiento que está viendo ahora es definitivamente correcto.

Si desea ver el tipo declarado del método en su lugar a continuación, utilizar una de las siguientes

typeof(TheContainingType) 
MethodBase.GetCurrentMethod().DeclaringType 
Cuestiones relacionadas