// 基底クラス
public class Base {}
// サブクラス
public class SubClass : Base {}
// とあるクラス
public class Foo
{
// 実体は List だけど IEnumerable として公開
public IEnumerable Classes
{
get { return new List<SubClass>(); }
}
}
これでリフレクションを用いて、Classes プロパティが IEnumerable
var propType = typeof(Foo).GetProperty("Classes").PropertyType;
bool impl = false;
// これは false
impl = propType.IsSubclassOf(typeof(IEnumerable));
// これで IEnumerable を実装していることは判別できた
var filter = new System.Reflection.TypeFilter((t, obj) => t == (Type)obj);
impl = propType.FindInterfaces(filter, typeof(IEnumerable)) > 0;
// 最終的にはこう
impl = impl && propType.IsGenericType && propType.GetGenericParameters()[0].IsSubclassOf(typeof(Base));
かなり長ったらしくてめんどくさい。なんか簡単な方法があるはずだと思って調べてみたら、これだけでできた。
typeof(IEnumerable<Base>).IsAssignableFrom(propType)代入可能かどうかで調べたらよかったのか。
0 件のコメント :
コメントを投稿