您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

显然没有。

选项如下:

正如您已经发现的,如果两种类型相同,则将无法正常工作,这是一个示例LINQPad程序,该程序演示:

void Main()
{
    typeof(Derived).IsSubclassOf(typeof(Base)).Dump();
    typeof(Base).IsSubclassOf(typeof(Base)).Dump();
}

public class Base { }
public class Derived : Base { }

输出

True
False

这表明Derived是的子类Base,但Base(显然)不是其子类。

现在,这将回答您的特定问题,但也会给您带来误报。正如埃里克·利珀特(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 { }

在这里,您将获得以下输出

True
True
True

True如果方法 回答了所问的问题,则最后一个指示将表明该方法uint[]继承自int[]或它们是同一类型,显然不是这种情况。

所以IsAssignableFrom也不是完全正确的。

“问题”与isas你的问题的背景是,他们会要求你对对象进行操作和写直接在代码中的类型之一,而不是与工作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 not
           inherit from BaseClass

尽管上述方法可能满足您的需求,但对您问题的唯一正确答案(如我所见)是您将需要进行额外的检查:

typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);

方法中哪个更有意义:

public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
    return potentialDescendant.IsSubclassOf(potentialBase)
           || potentialDescendant == potentialBase;
}
其他 2022/1/1 18:15:27 有360人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶