2012/05/19

特定のインターフェースを実装しているかどうかを調べる

プロパティの型が IEnumerable かどうかを判別したかった。
// 基底クラス
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 件のコメント :

コメントを投稿