2011-05-19 64 views
4

我目前正在使用C++和.NET 1.1(不要問...),我想檢查一個對象是否是CheckBox。如何將GetType()用於CheckBox?

GetType似乎是一個明顯的選擇,但由於某種原因,我無法讓它像我想要的那樣工作。在CheckBox的一個實例上使用GetType()可以正常工作,但嘗試使用Type::GetType("System.Windows.Forms.CheckBox")則不行。

儘管應該(至少在我的腦海裏)應該輸入GetType(temp)的完美格式化字符串,下面的代碼將在第二行引發異常。如果我將temp替換爲例如"System.Int32",它也可以正常工作。

String* temp = (this->checkBox1->GetType())->ToString(); 
temp = (System::Type::GetType(temp))->ToString(); 

這是爲什麼? =)

我可以想象幾種不同的方法可以解決這個問題,但這只是讓我誤以爲我無法按我認爲應該的方式工作。

回答

2

它看起來像你使用託管擴展C++。如果是這樣,請嘗試以下內容

if (this->checkBox1->GetType() == __typeof(CheckBox)) { 
    ... 
} 
+0

我會承認我不知道這意味着什麼,但它像一個魅力。 =) – 2011-05-19 16:05:02

+0

@Jon,'__typeof'運算符將爲給定的命名值返回一個'Type'對象。 'Type'的實例可以直接比較,所以'GetType()== __typeof'實際上是要求「checkBox1的運行時類型是'CheckBox'類型嗎? – JaredPar 2011-05-19 16:10:32

+0

是的,我明白代碼的作用,我只是不明白爲什麼它需要這樣,但我猜我應該閱讀一下託管擴展? =) – 2011-05-19 16:14:54

2

除非您正在加載的類型在mscorlib或調用程序集中,否則您需要提供完全合格的程序集名稱,包括鍵等。有關更多詳細信息,請參見docs for Type::GetType(string)

如果您提前知道裝配,Assembly::GetType(string)可能是一種更簡單的 方法。

編輯:我假設你不知道編譯時的編譯類型,只能作爲一個字符串。否則使用Jared的答案:)

+0

我相信OP使用C++來管理擴展,所以他們需要使用'::'和'''來進行靜態訪問。示例'Assembly :: GetType' – JaredPar 2011-05-19 15:56:27

+0

@Jared:謝謝,編輯。 – 2011-05-19 16:01:20