任何人都可以帮助我吗?我无法弄清楚我做错了什么,但似乎会有一个简单的解决方案:
通常你可以像这样使用is
:
if (theObject is MyClass) ...
但是如果你想指定它在运行时检查的类型,那就不会编译
Type theType = ...
if (theObject is theType) ...
我试过这样做:
if (theObject.GetType() == theType) ...
但是只有在theType
是那种确切类型并且不考虑is
语句所做的继承
我确定存在一个解决方案(可能使用泛型)但我现在想不到一个(它突然记得你点击'发布'时如何做的事情)
答案 0 :(得分:14)
听起来你想要IsAssignableFrom(),就像在
中一样if (theType.IsAssignableFrom(theObject.GetType())) ...
答案 1 :(得分:5)
使用Type.IsAssignableFrom()
答案 2 :(得分:2)
您正在寻找Type.IsSubclassOf
或Type.IsAssignableFrom
方法,具体取决于具体情况(通常是后者而不是前者)。后者稍微有用,因为如果类型与您要检查的类型相同,它将返回true,而显然,类型本身不是子类。此外,IsSubclassOf
未考虑泛型约束,而IsAssignableFrom
则会考虑。
答案 3 :(得分:1)
Type.IsAssignableFrom
答案是正确的。你尝试的方式不起作用的原因是因为有两种“类型”。第一个是编译时类型,它是if (theObject is MyClass)
使用的类型。它也是泛型中使用的那种。
另一种是System.Type
类型,这是你的第二种类型。您可以使用System.Type
关键字将编译时间转换为typeof
。你的第二个例子的等值是if (theObject is typeof(MyClass))
,它不会编译。
编译时类型可能有更正式或更正确的名称,因此如果有人知道可以随意编辑或评论它。
答案 4 :(得分:0)
您是否尝试过使用IsAssignableFrom()?
if( typeof(MyBaseClass).IsAssignableFrom(theType.GetType()) );
答案 5 :(得分:0)
除了等于比较之外,您还可以使用Type.IsSubclassOf来执行此操作。