2011-05-19 43 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