System.Typeが特定のクラスの子孫であるかどうかを確認する最良の方法
-
07-07-2019 - |
質問
次のコードを検討してください:
public class A
{
}
public class B : A
{
}
public class C : B
{
}
class D
{
public static bool IsDescendantOf(this System.Type thisType, System.Type thatType)
{
/// ???
}
void Main()
{
A cValue = new C();
C.GetType().IsDescendantOf(cValue.GetType());
}
}
IsDescendantOfを実装する最良の方法は何ですか?
解決
Type.IsSubclassOf()は、現在のTypeによって表されるクラスは、指定されたTypeによって表されるクラスから派生します。
他のヒント
おそらく Type.IsAssignableFrom を探しています。 。
これはあなたの質問に直接答えないことはわかっていますが、例のメソッドの代わりにこれを使用することを検討するかもしれません:
public static bool IsDescendantOf<T>(this object o)
{
if(o == null) throw new ArgumentNullException();
return typeof(T).IsSubclassOf(o.GetType());
}
したがって、次のように使用できます:
C c = new C();
c.IsDescendantOf<A>();
また、Type.IsSubclassOfとType.IsAssignableFromの違いに関する質問に答えるには、IsAssignableFromは2つのオブジェクトaとbがあり、これが有効であるという意味で弱いです。
a = b;
Then typeof(A).IsAssignableFrom(b.GetType())
はtrue-ですので、aはbのサブクラス、またはインターフェース型になります。
対照的に、 a.GetType()。IsSubclassOf(typeof(B))
は、aがbのサブクラスである場合にのみtrueを返します。拡張メソッドの名前を指定すると、IsAssignableの代わりにIsSubclassOfを使用する必要があります;
所属していません StackOverflow