2 minutes
[Unity] あるクラスに指定のInterfaceがあるか確認する
お世話になっております。
しゃまとんです。
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ではないので注意が必要ですね。
ジェネリックはビルド時にエラーになるけど。
(常に実行して確認しろ!というのは至極当然ですが…)
今日も勉強になりました。
以上です。
■参考