rksoftware

Visual Studio とか C# とかが好きです

C# でクラスがとあるインタフェースを実装しているかを調べる

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)

を推しておきます。