Answers:
显然没有。
选项如下:
is
和 as
正如您已经发现的,如果两种类型相同,则将无法正常工作,这是一个示例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
也不是完全正确的。
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;
}
IsInstanceOfType
适应呢?
typeof(BaseClass).IsAssignableFrom(unknownType);
您应该尝试使用Type.IsAssignableFrom。
如果您尝试在Xamarin Forms PCL项目中执行此操作,则使用的上述解决方案IsAssignableFrom
会出现错误:
错误:“类型”不包含“ IsAssignableFrom”的定义,找不到找不到接受“类型”类型第一个参数的扩展方法“ IsAssignableFrom”(您是否缺少using指令或程序集引用?)
因为IsAssignableFrom
要一个TypeInfo
对象。您可以使用以下GetTypeInfo()
方法System.Reflection
:
typeof(BaseClass).GetTypeInfo().IsAssignableFrom(typeof(unknownType).GetTypeInfo())
我正在发布此答案,希望有人与我分享是否以及为什么这不是一个好主意。在我的应用程序中,我具有要检查的Type属性,以确保它是typeof(A)或typeof(B),其中B是从A派生的任何类。所以我的代码是:
public class A
{
}
public class B : A
{
}
public class MyClass
{
private Type _helperType;
public Type HelperType
{
get { return _helperType; }
set
{
var testInstance = (A)Activator.CreateInstance(value);
if (testInstance==null)
throw new InvalidCastException("HelperType must be derived from A");
_helperType = value;
}
}
}
我觉得我在这里可能有点天真,所以欢迎任何反馈。