3 回答
TA贡献1851条经验 获得超3个赞
显然,没有。
这是选项:
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 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;}
TA贡献1773条经验 获得超3个赞
如果您正在尝试在Xamarin Forms PCL项目中执行此操作,则使用上述解决方案IsAssignableFrom
会出错:
错误:'Type'不包含'IsAssignableFrom'的定义,并且没有扩展方法'IsAssignableFrom'可以找到接受类型'Type'的第一个参数(你是否缺少using指令或汇编引用?)
因为IsAssignableFrom
请求一个TypeInfo
对象。您可以使用以下GetTypeInfo()
方法System.Reflection
:
typeof(BaseClass).GetTypeInfo().IsAssignableFrom(typeof(unknownType).GetTypeInfo())
- 3 回答
- 0 关注
- 547 浏览
添加回答
举报