显然没有。
选项如下:
- 使用Type.IsSubclassOf
- 使用Type.IsAssignableFrom
is
和as
Type.IsSubclassOf
正如您已经发现的,如果两种类型相同,则将无法正常工作,这是一个示例LINQPad程序,该程序演示:
void Main(){ typeof(Derived).IsSubclassOf(typeof(base)).Dump(); typeof(base).IsSubclassOf(typeof(base)).Dump();}public class base { }public class Derived : base { }输出:
TrueFalse
这表明
Derived是的子类
base,但
base(显然)不是其子类。
Type.IsAssignableFrom
现在,这将回答您的特定问题,但也会给您带来误报。正如埃里克·利珀特(Eric
Lippert)在评论中指出的那样,虽然该方法的确会
True为上述两个问题返回,但也会
True为这些问题而返回,您可能不希望这样做:
void Main(){ typeof(base).IsAssignableFrom(typeof(Derived)).Dump(); typeof(base).IsAssignableFrom(typeof(base)).Dump(); typeof(int[]).IsAssignableFrom(typeof(uint[])).Dump();}public class base { }public class Derived : base { }在这里,您将获得以下输出:
TrueTrueTrue
True如果方法 仅 回答了所问的问题,则最后一个指示将表明该方法
uint[]继承自
int[]或它们是同一类型,显然不是这种情况。
所以
IsAssignableFrom也不是完全正确的。
is
和 as
“问题”与
is和
as你的问题的背景是,他们会要求你对对象进行操作和写直接在代码中的类型之一,而不是与工作
Type对象。
换句话说,它将无法编译:
SubClass is baseClass^--+---^ | +-- need object reference here
也不会:
typeof(SubClass) is typeof(baseClass) ^-------+-------^ | +-- need type name here, not Type object
也不会:
typeof(SubClass) is baseClass^------+-------^ | +-- this returns a Type object, And "System.Type" does notinherit from baseClass
结论
尽管上述方法可能满足您的需求,但对您问题的唯一正确答案(如我所见)是您将需要进行额外的检查:
typeof(Derived).IsSubclassOf(typeof(base)) || typeof(Derived) == typeof(base);
在方法中哪个更有意义:
public bool IsSameOrSubclass(Type potentialbase, Type potentialDescendant){ return potentialDescendant.IsSubclassOf(potentialbase)|| potentialDescendant == potentialbase;}


