C# でクラスがとあるインタフェースを実装しているかが知りたくなることが、稀に良くあります。
■ Type.GetInterfaces メソッドの結果に Contains メソッド
クラスが実装しているインタフェースのリストは Type.GetInterfaces メソッドで簡単に取得できます。
参考
Type.GetInterfaces メソッドで取得したインタフェースのリストの中に調べたいインタフェースが含まれているかを確認することで、目的を達成できます。
■ 実例
次のインタフェースとクラスがあるものとします。
interface IMyInterface1 { } interface IMyInterface2 { } class MyClass0 { } class MyClass1 : IMyInterface1 { } class MyClass2 : IMyInterface2 { }
このクラスに対して次のコードで IMyInterface1
インタフェースが実装されているか。
var interface1 = typeof(IMyInterface1); var class0 = typeof(MyClass0); var class1 = typeof(MyClass1); var class2 = typeof(MyClass2); Console.WriteLine($"MyClass0 は {class0.GetInterfaces().Contains(interface1)}"); Console.WriteLine($"MyClass1 は {class1.GetInterfaces().Contains(interface1)}"); Console.WriteLine($"MyClass2 は {class2.GetInterfaces().Contains(interface1)}");
実行結果
MyClass0 は False MyClass1 は True MyClass2 は False
かんたんですね。
■ おまけ
Type.GetInterface メソッド を使う
他にも Type.GetInterface メソッドを使う方法も考えられます。やっていることはあまり大きくは変わりませんが。
名前を指定して実装しているインタフェースを取得し、もし実装されていなかった場合は null が返るのでそれで判断します。
var interface1 = typeof(IMyInterface1); var class0 = typeof(MyClass0); var class1 = typeof(MyClass1); var class2 = typeof(MyClass2); Console.WriteLine($"MyClass0 は {class0.GetInterface(interface1.FullName) != null}"); Console.WriteLine($"MyClass1 は {class1.GetInterface(interface1.FullName) != null}"); Console.WriteLine($"MyClass2 は {class2.GetInterface(interface1.FullName) != null}");
こちらの方法の方が分かりやすいかもしれませんが、手元で動かしたところ前者のほうが速かったので、今回は
Type.GetInterfaces().Contains(type)
を推しておきます。