IsAssignableFrom と GetInterface の違いは何ですか?
-
01-07-2019 - |
質問
.Net でリフレクションを使用すると、次の違いは何ですか。
if (foo.IsAssignableFrom(typeof(IBar)))
そして
if (foo.GetInterface(typeof(IBar).FullName) != null)
どちらがより適切ですか、なぜですか?
どちらか一方が失敗する可能性があるのはどのような場合ですか?
解決
型が特定のインターフェイスを実装しているかどうかを確認したいだけの場合は、どちらでも問題ありませんが、IsAssignableFrom() は GetInterface() よりも多くの内部チェックを実行するため、おそらく GetInterface() の方が高速です。おそらく、他の両方のメソッドが使用するのと同じ内部リストを返す Type.GetInterfaces() の結果をチェックする方がさらに速くなります。
他のヒント
内部クラスの処理方法には違いがあります。次のクラスを受講してください。
public interface IFoo
{
}
internal class Foo: IFoo
{
}
これにより、1 つの項目のリストが表示されます。
var types = typeof(IFoo).Assembly.GetTypes()
.Where(x => x.GetInterface(typeof(IFoo).FullName) != null)
.ToList();
一方、これにより空のリストが得られます。
var types = typeof(IFoo).Assembly.GetTypes()
.Where(x => x.IsAssignableFrom(typeof(IFoo))
.ToList();
所属していません StackOverflow