お世話になっております。
しゃまとんです。

c#でジェネリックを使う場合、whereを利用して指定の条件のものしか使用できないようにしますよね。下記みたいな。

public class Child<T> : Parent where T : SomeInterface {...}
public class Hoge : Child<Fuga> {...}

それで、似たような感じでSystem.Typeな変数に対して、指定の型を含んでいるか確認できないかなーと思い、ちょっと調べることになったのでメモしておきます。
(今回は指定のInterfaceがあるか確認したかった)

結果的には含まれていてほしいクラスやインターフェース越しにIsAssignableFromというメソッドを使うと判断できるみたいです。
使い方はこんな感じで。

/ HogeがSomeInterfaceを持っていたらtrue

// 方法:1
typeof(SomeInterface).IsAssignableFrom(typeof(Hoge))

// 方法:2
typeof(Hoge).GetInterfaces().Contains(typeof(SomeInterface))

上記の場合だとHogeクラスのTypeから何か取得するかなーと思っていのですが、逆みたいでした。 Hogeクラスからも判定できるけど、IsAssignableのほうがベターっぽいですね。

このやり方を使うと、実行時のエラーになるのでビルドだけ通ったからOKではないので注意が必要ですね。 ジェネリックはビルド時にエラーになるけど。
(常に実行して確認しろ!というのは至極当然ですが…)

今日も勉強になりました。
以上です。

■参考