2010-03-09 85 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。應該爲你工作。

另一方面,您可能希望爲所有數據類使用一個虛擬基類,並使用一個成員變量來描述它的類型。