que tienen las siguientes clases genéricas:¿Cómo probar si dos genéricos tienen una relación base-subclase sin instanciarlos?
class Base<T> where T : ... { ... }
class Derived<T> : Base<T> where T : ... { ... }
class Another<T> where T : ... { ... }
class DerivedFromDerived<T> : Derived<T> where T : ... { ... }
En algún lugar de mi código, me gustaría probar si una hereda genérico que se da a partir Base<T>
, sin crear una instancia particular de los genéricos. ¿Cómo puedo hacer eso?
static bool DerivedFromBase(Type type) { /* ??? */ }
static void Main(string[] args)
{
Console.WriteLine(DerivedFromBase(typeof(Derived<>))); // true
Console.WriteLine(DerivedFromBase(typeof(Another<>))); // false
Console.WriteLine(DerivedFromBase(typeof(DerivedFromDerived<>))); // true
Console.ReadKey(true);
}
EDIT: Gracias Marcos. Ahora veo la luz. Intenté originalmente lo siguiente:
typeof(Derived<>).BaseType == typeof(Base<>)
Aparentemente, esto es correcto. Pero no lo es. El problema es que Base
's T no es lo mismo que Derived
' s T. Por lo tanto, en
typeof(Base<>)
Base
's T
es un tipo libre. Pero, en
typeof(Derived<>).BaseType
Base
's T
está obligado a Derived
' s T
, que es a su vez un tipo libre. (Esto es tan impresionante Me AMOR para ver la System.Reflection
'código fuente s!) Ahora,
typeof(Derived<>).BaseType.GetGenericTypeDefinition()
unbounds Base
' s T
. Conclusión:
typeof(Derived<>).BaseType.GetGenericTypeDefinition() == typeof(Base<>)
Y ahora, si todos discúlpenme, mi cabeza está ardiendo.
Estoy interesado en recibir respuestas aquí, porque yo creo * * '' Derivado no es una subclase de '' Base –
@ Matt Greer: De hecho, '' Derivado no es una subclase de '' Base . –
pyon
Creo que Mark ha respondido correctamente a su pregunta, pero creo que podría querer decir algo más como Matt mencionó anteriormente. ¿Podrías aclarar? – briantyler