在delphi中可以很轻松的利用rtti机制来动态访问对象相关属性的值,在C++Builder如何利用该机制?
在定义C++ Builder类是在需要添加__declspec(delphiclass)或__declspec(delphirtti)宏定义,这样定义就打开了C++的Rtti机制。C++类定义如下:
class __declspec(delphiclass) THeader{
public:
unsigned short HeadStart[4];
unsigned short HeadString[6];
unsigned int Counter;
unsigned short HeadEnd[4];
};
引用该类时需要引用单元中加上#include <Rtti.hpp>头及#pragma explicit_rtti methods(__published, public) properties(__published, public) fields(__published, public, protected, private)
上面定义的THeader类中仅仅定义了四个Public类型字段,若动态访问类中的四个字段需在引用头文件后面至少添加如下内容:
#pragma explicit_rtti fields(public)
具体代码如下:
#include <vcl.h>**
#pragma hdrstop
#include "Unit1.h"
#include <Rtti.hpp>
#pragma explicit_rtti fields(public)//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;//---------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TRttiContext context; // Get class RTTI
THeader*test=newTHeader;
test->Counter=500;
TRttiType *cls =context.GetType(__delphirtti(THeader));
TRttiField *field = cls->GetField("Counter");
int i=field->GetValue(test).AsInteger();
}