如何在结构上使用typeid()

时间:2015-02-16 16:38:37

标签: .net c++-cli

在CLI项目中,我有一个带有Object ^的函数,并且必须知道Object中存储了哪种类型。我的代码适用于类,但如何将它用于结构?

using namespace System::Drawing;

void AddObject(Object^% o_Object)
{
    Type^ i_Type = o_Object->GetType();

    if (i_Type == String::typeid) // OK
    {
        ... do something
        return;
    }

    if (i_Type == Rectangle::typeid) // ERROR
    {
        ... do something
        return;
    }
}

编译器说: 错误C3083:'矩形&#39 ;:' ::'左边的符号必须是一种类型。

然后我尝试了:

if (i_Type == typeid(Rectangle))
{
    ... do someting
    return;
}

现在它告诉我: 错误C2446:' ==' :没有来自' const type_info'到'系统::类型^'

然后我尝试了:

if (typeid(o_Object) == typeid(Rectangle))
{
    ... do someting
    return;
}

现在它告诉我: 错误C3185:' typeid' :用于托管类型' System :: Object ^',使用' System :: Object ^ :: typeid'代替

然后我尝试了:

if (o_Object::typeid == typeid(Rectangle))
{
    ... do someting
    return;
}

它告诉我: 错误C2653:' o_Object' :不是类或命名空间名称

我该怎么办?

1 个答案:

答案 0 :(得分:0)

我找到了原因:

编译器不会使用System :: Drawing :: Rectangle你写的:

using namespace System::Drawing;

在顶部。 编译器采用函数

WINGDIAPI BOOL WINAPI Rectangle(__in HDC hdc, __in int left, __in int top, __in int right, __in int bottom);

而是在WinGdi.h中定义。

我必须补充:

#using <system.drawing.dll>

在顶部

并且另外写:

if (i_Type == System::Drawing::Rectangle::typeid)
{
     ... do someting
     return;
}

解决歧义。

如果我最初认为的是从类或结构中取出的,那么它无关。