typeid(C++/CLI 和 C++/CX)

获取指明对象类型的值。

注意

本主题引用 typeid 的 C++ 组件扩展版本。 有关此关键字的 ISO C++ 版本,请参阅 typeid 运算符

所有运行时

语法

T::typeid

参数

T
类型名称。

Windows 运行时

语法

Platform::Type^ type = T::typeid;

参数

T
类型名称。

备注

在 C++/CX 中,typeid 返回根据运行时类型信息构造的 Platform::Type

要求

编译器选项:/ZW

公共语言运行时

语法

System::Type^ type = T::typeid;

参数

type
要为其获取 System::Type 对象的类型(抽象声明符)的名称。

注解

typeid 用于在编译时为类型获取 Type

typeid 类似于在运行时使用 GetTypeGetType 获取类型的 System::Type。 但是,typeid 只接受类型名称作为参数。 如果要使用类型的实例来获取其 System::Type 名称,请使用 GetType

typeid 必须可以在编译时计算类型名称(类型),而 GetType 则计算要在运行时返回的类型。

typeid 可以使用本机类型名称,也可以使用本机类型名称的公共语言运行时别名;有关详细信息,请参阅相当于 C++ 本机类型的 .NET Framework 类型 (C++/CLI)

typeid 也适用于本机类型,但仍会返回 System::Type。 要获取 type_info 结构,请使用 typeid 运算符

要求

编译器选项:/clr

示例

下面的示例比较 typeid 关键字与 GetType() 成员。

// keyword__typeid.cpp
// compile with: /clr
using namespace System;

ref struct G {
   int i;
};

int main() {
   G ^ pG = gcnew G;
   Type ^ pType = pG->GetType();
   Type ^ pType2 = G::typeid;

   if (pType == pType2)
      Console::WriteLine("typeid and GetType returned the same System::Type");
   Console::WriteLine(G::typeid);

   typedef float* FloatPtr;
   Console::WriteLine(FloatPtr::typeid);
}
typeid and GetType returned the same System::Type
G

System.Single*

下面的示例展示了类型变量 System::Type 可用于获取类型的特性。 它还展示了,必须对一些类型创建 typedef,才能使用 typeid

// keyword__typeid_2.cpp
// compile with: /clr
using namespace System;
using namespace System::Security;
using namespace System::Security::Permissions;

typedef int ^ handle_to_int;
typedef int * pointer_to_int;

public ref class MyClass {};

class MyClass2 {};

[attribute(AttributeTargets::All)]
ref class AtClass {
public:
   AtClass(Type ^) {
      Console::WriteLine("in AtClass Type ^ constructor");
   }
};

[attribute(AttributeTargets::All)]
ref class AtClass2 {
public:
   AtClass2() {
      Console::WriteLine("in AtClass2 constructor");
   }
};

// Apply the AtClass and AtClass2 attributes to class B
[AtClass(MyClass::typeid), AtClass2]
[AttributeUsage(AttributeTargets::All)]
ref class B : Attribute {};

int main() {
   Type ^ MyType = B::typeid;

   Console::WriteLine(MyType->IsClass);

   array<Object^>^ MyArray = MyType -> GetCustomAttributes(true);
   for (int i = 0 ; i < MyArray->Length ; i++ )
      Console::WriteLine(MyArray[i]);

   if (int::typeid != pointer_to_int::typeid)
      Console::WriteLine("int::typeid != pointer_to_int::typeid, as expected");

   if (int::typeid == handle_to_int::typeid)
      Console::WriteLine("int::typeid == handle_to_int::typeid, as expected");
}
True

in AtClass2 constructor

in AtClass Type ^ constructor

AtClass2

System.AttributeUsageAttribute

AtClass

int::typeid != pointer_to_int::typeid, as expected

int::typeid == handle_to_int::typeid, as expected

另请参阅

.NET 和 UWP 的组件扩展