2009-09-16 7 views
15

Considere el siguiente código:mejor manera de comprobar si System.Type es un descendiente de una clase dada

public class A 
{ 
} 

public class B : A 
{ 
} 

public class C : B 
{ 
} 

class D 
{ 
    public static bool IsDescendantOf(this System.Type thisType, System.Type thatType) 
    { 
     /// ??? 
    } 

    void Main() 
    { 
     A cValue = new C(); 
     C.GetType().IsDescendantOf(cValue.GetType()); 
    } 
} 

¿Cuál es la mejor manera de implementar IsDescendantOf?

Respuesta

21

Type.IsSubclassOf() Determina si la clase representada por el tipo actual deriva de la clase representada por el tipo especificado.

+1

Hmm ... Eso debería funcionar bien también. Ahora tengo curiosidad por saber cuál es la diferencia entre Type.IsAssgnableFrom y Type.IsSubclassOf? – sh0gged

+1

type1.IsAssignableFrom (type2) funcionará si type1 es una interfaz –

+0

Ahora supongo que Type.IsSubclassOf() es más parecido a lo que estaba buscando. :) Gracias. – sh0gged

14

Probablemente estés buscando Type.IsAssignableFrom.

+0

Yeap, eso funciona para mí. ¡Gracias! – sh0gged

+0

Esto es útil, pero devolverá 'true' si ambos tipos son iguales. Hay algunas diferencias entre la compatibilidad de asignación y la herencia. También me resulta más difícil de leer que 'IsSubClassOf'. – Sam

0

creo que busca este Type.IsSubclassOf()

Editar:

No sé sus necesidades, pero puede ser que esa es la mejor manera:

bool isDescendant = cValue is C; 
+1

Creo que en el caso de System.Type simplemente no funciona. – sh0gged

5

Me di cuenta que no lo hace responda directamente su pregunta, pero puede considerar usar esto en lugar del método en su ejemplo:

public static bool IsDescendantOf<T>(this object o) 
{ 
    if(o == null) throw new ArgumentNullException(); 
    return typeof(T).IsSubclassOf(o.GetType()); 
} 

Así que usted puede utilizar de esta manera:

C c = new C(); 
c.IsDescendantOf<A>(); 

Además, para responder a su pregunta sobre la diferencia entre Type.IsSubclassOf y Type.IsAssignableFrom - IsAssignableFrom es más débil en el sentido de que si tiene dos objetos A y B de tal manera que esto es válido:

a = b; 

Entonces typeof(A).IsAssignableFrom(b.GetType()) es cierto - por lo que una podría ser una subclase de b, o un tipo de interfaz.

En contraste, a.GetType().IsSubclassOf(typeof(B)) solo devolvería true si a fuera una subclase de b. Dado el nombre de su método de extensión, diría que debería usar IsSubclassOf en lugar de IsAssignable para;

+0

Buen punto. Gracias. – sh0gged

+0

¿Es correcto el segundo párrafo? Pensé que 'a.GetType(). IsAssignableFrom (typeof (b))' sería verdadero si 'a = b;' era válido. – Sam

+0

@Sam - Sí, tienes razón, gracias. – Lee

Cuestiones relacionadas