web-dev-qa-db-ja.com

リフレクションを介してインターフェイスのベースタイプを取得するにはどうすればよいですか?

public interface IBar {} 
public interface IFoo : IBar {}

typeof(IFoo).BaseType == null

IBarを入手するにはどうすればよいですか?

25
Kevin Driedger
Type[] types = typeof(IFoo).GetInterfaces();

編集:特にIBarが必要な場合は、次のことができます。

Type type = typeof(IFoo).GetInterface("IBar");
54
BFree

インターフェイスは基本タイプではありません。インターフェイスは継承ツリーの一部ではありません。

インターフェイスリストにアクセスするには、次を使用できます。

typeof(IFoo).GetInterfaces()

または、インターフェース名がわかっている場合:

typeof(IFoo).GetInterface("IBar")

ある型が別の型と暗黙的に互換性があるかどうかだけを知りたい場合は(私が探しているものだと思います)、type.IsAssignableFrom(fromType)を使用します。これは「is」キーワードと同等ですが、実行時型があります。

例:

if(foo is IBar) {
    // ...
}

と同等です:

if(typeof(IBar).IsAssignableFrom(foo.GetType())) {
    // ...
}

しかし、あなたの場合、あなたはおそらくもっと興味があります:

if(typeof(IBar).IsAssignableFrom(typeof(IFoo))) {
    // ...
}
28
Coincoin

他の投稿者が書いたものに加えて、GetInterface()リストから最初のインターフェイスを取得して(リストが空でない場合)、IFooの直接の親を取得できます。これは、.BaseTypeの試行とまったく同じです。

1
Paul-Jan