2010-03-09 84 views
9

有没有简单的方法来检查对象的类型?我需要沿着以下的说法:如何在C++/CLI中检查对象的类型?

MyObject^ mo = gcnew MyObject(); 
Object^ o = mo; 

if(o->GetType() == MyObject) 
{ 
    // Do somethine with the object 
} 
else 
{ 
    // Try something else 
} 

目前我使用的是寻找System::InvalidCastException S的感觉丑,但工程嵌套的try-catch块。我正在尝试和分析上面的代码,看它是否更快/更慢/可读,但不能解决甚至尝试的语法。

如果有人想知道,这是因为有一个队列进入一个提供数据的线程。偶尔我想更改设置并通过数据队列传递它们是一种简单的方法。

回答

24

您可以在C++中使用MyObject::typeid,方法与在C#中使用typeof(MyObject)相同。下面的代码无耻地复制你的问题和修改...

MyObject^ mo = gcnew MyObject(); 
Object^ o = mo; 

if(o->GetType() == MyObject::typeid) 
{ 
    // Do somethine with the object 
} 
else 
{ 
    // Try something else 
} 
+0

+ 1 /接受:这是完美的 - 谢谢! – 2010-03-11 12:49:24

+0

这在VS 2010/2012中仍然有效吗?没有看到那个typeid成员... – bbqchickenrobot 2012-09-11 21:02:48

+1

它仍然在VS2010中工作。我没有VS2012所以不能评论最新的VS版本。这可能是因为你没有“看到那个typeid成员”,因为C++/CLI的自动完成不包含在VS2010中。 – mcdave 2012-09-12 15:00:41

9

你应该检查出How to: Implement is and as C# Keywords in C++

该主题将演示如何实现IS的和在Visual C++ C#关键字的功能。

+0

有没有办法做到泛型而不是模板,以便该方法可以在外部程序集中使用? – 2010-03-10 11:14:49

0

编辑:我会在这里留下。但是这个答案是针对C++的。可能与CLI执行此操作时甚至没有什么关系。

您需要使用RTTI(运行时类型信息)进行编译。然后看看维基百科文章http://en.wikipedia.org/wiki/Run-time_type_information并搜索谷歌RTTI。应该为你工作。

另一方面,您可能希望为所有数据类使用一个虚拟基类,并使用一个成员变量来描述它的类型。