Pregunta

Considere el siguiente código:

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?

¿Fue útil?

Solución

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

Otros consejos

Probablemente esté buscando Type.IsAssignableFrom .

Me doy cuenta de que esto no responde directamente a su pregunta, pero podría 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());
}

Para que pueda usarlo así:

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, esto es válido:

a = b;

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

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

Creo que está buscando este Type.IsSubclassOf ( )

Editar:

No conozco tus requisitos, pero puede ser esa la mejor manera:

bool isDescendant = cValue is C;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top