请考虑以下代码:
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的最佳方法是什么?
答案 0 :(得分:23)
Type.IsSubclassOf()确定当前Type所代表的类是否来自指定Type所代表的类。
答案 1 :(得分:15)
您可能正在寻找Type.IsAssignableFrom。
答案 2 :(得分:5)
我意识到这并没有直接回答你的问题,但你可以考虑使用它而不是你的例子中的方法:
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在某种意义上是较弱的,如果你有两个对象a和b,这是有效的:
a = b;
然后typeof(A).IsAssignableFrom(b.GetType())
为真 - 所以a可以是b的子类,或者是接口类型。
相反,如果a是b的子类,a.GetType().IsSubclassOf(typeof(B))
只会返回true。鉴于你的扩展方法的名称,我会说你应该使用IsSubclassOf代替IsAssignable;
答案 3 :(得分:0)