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);
}
Verbrauch:
bool derived = IsDerivedFrom(typeof(Foo), typeof(GenericFoo<>));
Diese Prüfungen bestehen:
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<>)));
}
, dass so viele Ausnahmen auslösen kann, wenn es nicht ein Basistyp ist, oder es ist nicht eine generische Typdefinition, und es schlägt fehl, wenn 'Bar: Foo: GenericFoo' und auf und weiter. –
jason
Ich weiß aber in jedem Fall funktioniert es für obiges Beispiel. Und @Edison kann Ausnahmen hinzufügen, die sich selbst behandeln. Es ist nur eine Idee. –
Ich habe den Beispielcode ausprobiert und einige Ausnahmen hinzugefügt. Es funktioniert jetzt perfekt. Andere Antworten hier gaben mir auch einige hilfreiche Informationen, aber ich weiß nicht, warum ich diesen nützlichen Antworten nicht zustimmen kann. –