使用'is',在运行时定义类型

时间:2010-08-16 18:58:11

标签: c# casting

任何人都可以帮助我吗?我无法弄清楚我做错了什么,但似乎会有一个简单的解决方案:

通常你可以像这样使用is

if (theObject is MyClass) ...

但是如果你想指定它在运行时检查的类型,那就不会编译

Type theType = ...
if (theObject is theType) ...

我试过这样做:

if (theObject.GetType() == theType) ...

但是只有在theType是那种确切类型并且不考虑is语句所做的继承

时才有效

我确定存在一个解决方案(可能使用泛型)但我现在想不到一个(它突然记得你点击'发布'时如何做的事情)

6 个答案:

答案 0 :(得分:14)

听起来你想要IsAssignableFrom(),就像在

中一样
if (theType.IsAssignableFrom(theObject.GetType())) ...

答案 1 :(得分:5)

使用Type.IsAssignableFrom()

答案 2 :(得分:2)

您正在寻找Type.IsSubclassOfType.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来执行此操作。