あるオブジェクトに特定のクラスやインターフェースが継承されているかどうかを調べる処理方法は以下の通りです。
public static bool IsInherited1<T>(object obj) where T : class { return (obj as T) != null; // ★(1) asで変換できるかどうか調べる } public static bool IsInherited2<T>(object obj) where T : class { return obj is T; // ★(2) is演算子でチェックする } public static bool IsInherited3<T>(object obj) where T : class { return typeof(T).IsAssignableFrom(obj.GetType()); // ★(3) 型情報を用いてチェックする }
確認コード
上記の確認用コードは以下の通り
// クラスの定義 public interface IBase { } public class Base : IBase { } public class DerivedA : Base { } public class DerivedB : DerivedA { } public class Sample { } // これだけ関係ない private static void Main(string[] args) { DerivedB obj = new DerivedB(); // asで変換できるかどうか調べる bool a = IsInherited1<IBase>(obj); bool b = IsInherited1<Base>(obj); bool c = IsInherited1<DerivedA>(obj); bool d = IsInherited1<Sample>(obj); Console.WriteLine($"a={a}, b={b}, c={c}, d={d}"); //> a=True, b=True, c=True, d=False // is演算子でチェックする a = IsInherited2<IBase>(obj); b = IsInherited2<Base>(obj); c = IsInherited2<DerivedA>(obj); d = IsInherited2<Sample>(obj); Console.WriteLine($"a={a}, b={b}, c={c}, d={d}"); //> a=True, b=True, c=True, d=False // 型情報を用いてチェックする a = IsInherited3<IBase>(obj); b = IsInherited3<Base>(obj); c = IsInherited3<DerivedA>(obj); d = IsInherited3<Sample>(obj); Console.WriteLine($"a={a}, b={b}, c={c}, d={d}"); //> a=True, b=True, c=True, d=False }
また、変換できるか確認して変換結果を得たい時は以下のように実装します。
// 変換できる場合trueが帰り結果がresultに格納される public static bool TryIsInherited<T>(object obj, out T result) where T : class { return (result = (obj as T)) != null; }