__delphirtti System::Typinfo::GetEnumName

运行期获取

__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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值