bool IsDerivedFrom(Type type, Type genericBaseTypeDefinition) {
Contract.Requires(type != null);
Contract.Requires(genericBaseTypeDefinition != null);
Contract.Requires(genericBaseTypeDefinition.IsGenericBaseTypeDefinition);
Type baseType = type.BaseType;
if (baseType == null) {
return false;
}
if (baseType.IsGenericType) {
Type generic = baseType.GetGenericTypeDefinition();
if (generic == null) {
return false;
}
return generic == genericBaseTypeDefinition;
}
return IsDerivedFrom(baseType, genericBaseTypeDefinition);
}
Uso:
bool derived = IsDerivedFrom(typeof(Foo), typeof(GenericFoo<>));
Estas pruebas Pass:
class GenericFoo<T> { }
class DerivedGenericFoo<T> : GenericFoo<T> { }
class Foo : GenericFoo<int> { }
class Bar : Foo { }
class Animal { }
[Fact]
public void DerivedGenericFoo_derives_from_open_GenericFoo() {
Assert.Equal(
true,
IsDerivedFrom(
typeof(DerivedGenericFoo<int>),
typeof(GenericFoo<>)
)
);
}
[Fact]
public void Foo_derives_from_open_GenericFoo() {
Assert.Equal(true, IsDerivedFrom(typeof(Foo), typeof(GenericFoo<>)));
}
[Fact]
public void Bar_derives_from_open_GenericFoo() {
Assert.Equal(true, IsDerivedFrom(typeof(Bar), typeof(GenericFoo<>)));
}
[Fact]
public void Animal_does_not_derive_from_open_GenericFoo() {
Assert.Equal(false, IsDerivedFrom(typeof(Animal), typeof(GenericFoo<>)));
}
que puede tirar tantas excepciones cuando no hay un tipo base, o no hay una definición de tipo genérico, y se produce un error cuando 'Bar: Foo: GenericFoo' y en y en. –
jason
Lo sé, pero de todos modos funciona para el ejemplo anterior. Y @Edison puede agregar excepciones manejándose solo. Es solo una idea. –
He intentado con el código de ejemplo y he agregado algunas excepciones para manejar el código. Es un trabajo perfecto ahora. Otras respuestas aquí también me dieron información útil, pero no sé por qué no puedo votar esas respuestas útiles. –