考虑下面的代码:
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.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是在这个意义上较弱,如果你有两个对象a和b,这是有效的:
a = b;
然后typeof(A).IsAssignableFrom(b.GetType())
是真-所以一个可能是B的一个子类,或接口类型。
相比之下, a.GetType().IsSubclassOf(typeof(B))
如果是B的子类,只会返回true。 鉴于您的扩展方法的名字,我会说,你应该使用,而不是IsAssignable到IsSubclassOf;
我认为你正在寻找这个Type.IsSubclassOf()
编辑:
我不知道你的要求,但可能这就是最好的方式:
bool isDescendant = cValue is C;