栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何检查类型是子类型还是对象的类型?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何检查类型是子类型还是对象的类型?

显然没有。

选项如下:

  • 使用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;}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/576141.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号