2008-10-21 8 views
8

esta es mi primera pregunta aquí, así que espero poder articularla bien y con suerte no será demasiado fácil.BaseType of a Basetype

I tienen la siguiente clase Subsim que se extiende Sim, que se extiende MainSim. En una clase completamente separada (y también en la biblioteca) necesito verificar si un objeto que se pasa es un tipo de MainSim. Entonces lo siguiente se hace para verificar;

 
Type t = GetType(sim); 
//in this case, sim = SubSim 
if (t != null) 
{ 
    return t.BaseType == typeof(MainSim); 
} 

Obviamente t.BaseType va a volver Sim desde Type.BaseType obtiene el tipo de la que el objeto Type actual hereda directamente.

corto de tener que hacer t.BaseType.BaseType para obtener MainSub, ¿hay alguna otra manera de obtener el tipo adecuado uso de las bibliotecas .NET? ¿O hay modificaciones que pueden redefinirse para devolver la clase principal?

gracias de antemano

Respuesta

17

Hay 4 maneras estándares relacionados:

sim is MainSim; 
(sim as MainSim) != null; 
sim.GetType().IsSubclassOf(typeof(MainSim)); 
typeof(MainSim).IsAssignableFrom(sim.GetType()); 

También puede crear un método recursivo:

bool IsMainSimType(Type t) 
{ if (t == typeof(MainSim)) return true; 
    if (t == typeof(object)) return false; 
    return IsMainSimType(t.BaseType); 
} 
+0

Me gusta ese método recursivo, y creo que voy a intentarlo en lugar de mi solución. ¡Gracias! –

10
if (sim is MainSim) 

es todo lo que necesita. "es" busca el árbol de herencia.

1

El 'es' la opción no funcionó para mí. Me dio la advertencia; "La expresión dada nunca es del tipo proporcionado ('MainSim')", creo sin embargo, la advertencia tenía más que ver con el marco que tenemos establecido. Mi solución terminó siendo:

return t.BaseType == typeof(MainSim) || t.BaseType.IsSubclassof(typeof(MainSim));

No tan limpio como esperaba, o tan sencillo como parecían tus respuestas. De todos modos, gracias a todos por sus respuestas. La simplicidad de ellos me hace darme cuenta de que tengo mucho que aprender.

+0

Probablemente "devolvió t es MainSim" en lugar de "return sim es MainSim". – Hallgrim

+0

Inicialmente lo intenté, lo que dejé fuera de mi pregunta es que el objeto 'sim' sería un objeto CollectionRow, no necesariamente un objeto Sim per se, es por eso que existe la llamada Type t = GetType (sim). Intenté un par de cosas más, pero de lo contrario devolvía el resultado falso. –