运行期获取
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
PTypeInfo info;
info = __delphirtti(TWindowState);
Caption = AnsiString(info->Name);
String kindName;
kindName = System::Typinfo::GetEnumName(__delphirtti(TTypeKind),
info->Kind);
Caption = kindName;
}
http://docwiki.embarcadero.com/CodeExamples/XE5/en/TypInfoGetEnumName_%28C%2B%2B%29
#include <vcl.h> #include <windows.h> #pragma hdrstop #pragma argsused #include <vector> #include <tchar.h> #include <stdio.h> #include <conio.h> #include <System.Generics.Collections.hpp> /* A template class */ template<class T> class TGenericClass : public std::vector<T> { public: void PrintTypeInfo(); }; template<class T> void TGenericClass<T>::PrintTypeInfo() { PTypeInfo Info = new TTypeInfo; PTypeData Data; String SubName, KindName; char tmpBuffer[256]; memset(tmpBuffer, 0, 256); /* Get type info for the "yet unknown type". */ Info = __delphirtti(T); /* There is no RTTI attached for some types, such as Records. */ if (Info != NULL) { strcpy(tmpBuffer, AnsiString(Info->Name).c_str()); printf("Type name: %s\n", tmpBuffer); /* Find out the name of an enum item from its ordinal value. */ KindName = System::Typinfo::GetEnumName(__delphirtti(TTypeKind), Info->Kind); strcpy(tmpBuffer, AnsiString(KindName).c_str()); printf("Type Kind: %s\n", tmpBuffer); memset(tmpBuffer, 0, 256); Data = GetTypeData(Info); if (Info->Kind == tkInteger) { /* In the case of Integer, here is the actual subtype name */ SubName = System::Typinfo::GetEnumName(__delphirtti(TOrdType), Data->OrdType); strcpy(tmpBuffer, AnsiString(SubName).c_str()); printf("Integer kind: %s\n", tmpBuffer); } if (Info->Kind == tkFloat) { /* In the case of Float, here is the actual subtype name. */ SubName = System::Typinfo::GetEnumName(__delphirtti(TFloatType), Data->FloatType); strcpy(tmpBuffer, AnsiString(SubName).c_str()); printf("Float kind: %s\n", tmpBuffer); } if (Info->Kind == tkDynArray + 1) { /* Check out the element size. */ printf("Element size: %d\n", Data->elSize); } printf("Size of type: %d\n\n", sizeof(T)); } } int _tmain(int argc, _TCHAR* argv[]) { TGenericClass<int> *IntClass = new TGenericClass<int>; IntClass->PrintTypeInfo(); TGenericClass<double> *DoubleClass = new TGenericClass<double>; DoubleClass->PrintTypeInfo(); TGenericClass<String> *StringClass = new TGenericClass<String>; StringClass->PrintTypeInfo(); /* Read a character to see the results. */ getch(); return 0; }