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);
}
使用法:
bool derived = IsDerivedFrom(typeof(Foo), typeof(GenericFoo<>));
これらのテストに合格:
0123を
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<>)));
}
:フー:GenericFoo'と上そして。 –
jason
私は知っていますが、とにかく上の例でうまくいきます。 @Edisonは自分自身を処理する例外を追加することができます。単なるアイデアです。 –
私はサンプルコードを試して、いくつかの例外処理コードを追加しました。完璧な作業です。他の回答もここに私に役立つ情報がありましたが、なぜ私はそれらの役に立つ答えに投票できないのか分かりません。 –