关于Record类型RTTI反射的用途和方法
2011-01-11 15:31
141 查看
问题的引入:
准备做一个多国语言软件,发现信息变量(都是字符串)数量庞大,如果简单的通过 “变量=readstring”从ini文件中获取的话,几百个变量就是几百行,这个工作量非常大,而且也不易维护。如果使用RTTI反射机制,未来变量变化时,赋值程序不用修改,只需修改变量结构,这是一劳永逸的做法。
注意:本例程使用delphi2010,delphi老版本不支持record类型的反射。如果使用老版本,需把record类型换为自定义类,这里只演示使用Record类型的方法。
办法如下:
先在C盘建立一个文本文件 c:/vars.txt ,内容如下(key值大小写均可)
name=SUNSTONE
age=37
sex=男
address=吉林省长春市
程序如下:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TmyRec = record
Name, Age, Sex, Address: string;
end;
var
Form2: TForm2;
implementation
uses rtti;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var
VarList: TStrings;
MyVar: TmyRec;
RTX: TRttiContext;
RT: TRttiType;
RF: TRttiField;
begin
Memo1.Clear;
VarList := TStringList.Create;
try
// 读取变量文件
VarList.LoadFromFile('c:/vars.txt');
// Record类型的RTTI反射
RT := RTX.GetType(TypeInfo(TmyRec));
for RF in RT.AsRecord.GetFields do
begin
Memo1.Lines.Add(RF.Name);
RF.SetValue(@MyVar, VarList.Values[RF.Name]);
end;
finally
VarList.Free;
end;
// 检查结果
Memo1.Lines.Add('');
Memo1.Lines.Add('----检查结果----');
Memo1.Lines.Add('Name: ' + MyVar.Name);
Memo1.Lines.Add('Age: ' + MyVar.Age);
Memo1.Lines.Add('Sex: ' + MyVar.Sex);
Memo1.Lines.Add('Address: ' + MyVar.Address);
end;
end.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sunstone/archive/2009/11/17/4819048.aspx
准备做一个多国语言软件,发现信息变量(都是字符串)数量庞大,如果简单的通过 “变量=readstring”从ini文件中获取的话,几百个变量就是几百行,这个工作量非常大,而且也不易维护。如果使用RTTI反射机制,未来变量变化时,赋值程序不用修改,只需修改变量结构,这是一劳永逸的做法。
注意:本例程使用delphi2010,delphi老版本不支持record类型的反射。如果使用老版本,需把record类型换为自定义类,这里只演示使用Record类型的方法。
办法如下:
先在C盘建立一个文本文件 c:/vars.txt ,内容如下(key值大小写均可)
name=SUNSTONE
age=37
sex=男
address=吉林省长春市
程序如下:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TmyRec = record
Name, Age, Sex, Address: string;
end;
var
Form2: TForm2;
implementation
uses rtti;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var
VarList: TStrings;
MyVar: TmyRec;
RTX: TRttiContext;
RT: TRttiType;
RF: TRttiField;
begin
Memo1.Clear;
VarList := TStringList.Create;
try
// 读取变量文件
VarList.LoadFromFile('c:/vars.txt');
// Record类型的RTTI反射
RT := RTX.GetType(TypeInfo(TmyRec));
for RF in RT.AsRecord.GetFields do
begin
Memo1.Lines.Add(RF.Name);
RF.SetValue(@MyVar, VarList.Values[RF.Name]);
end;
finally
VarList.Free;
end;
// 检查结果
Memo1.Lines.Add('');
Memo1.Lines.Add('----检查结果----');
Memo1.Lines.Add('Name: ' + MyVar.Name);
Memo1.Lines.Add('Age: ' + MyVar.Age);
Memo1.Lines.Add('Sex: ' + MyVar.Sex);
Memo1.Lines.Add('Address: ' + MyVar.Address);
end;
end.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sunstone/archive/2009/11/17/4819048.aspx
相关文章推荐
- 关于Record类型RTTI反射的用途和方法
- 关于Record类型RTTI反射的用途和方法
- C#关于通过反射PropertyType判读字符串类型方法
- 关于反射中创建类型实例的两种方法
- 黑马程序员--Java基础加强--14.利用反射操作泛型III【解析关于泛型类型的细节信息的获取方法】【Method与泛型相关的方法】【个人总结】
- 关于反射中创建类型实例的两种方法
- 类型信息(RTTI和反射)
- 关于VB方法返回值为值类型时,出现要求对象的理解
- 关于反射中.getDeclaredContructor()返回构造方法顺序的问题
- C++:关于C++的RTTI (运行阶段类型识别)
- [原创]让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型
- 关于反射类型的名词解释
- 关于解决从F1BOOK中读取时间类型的数据的方法
- 关于文件不能访问,IIS提示MIME类型没有错误的解决方法
- 关于反射中Assembly.Load("程序集").CreateInstance("命名空间.类")与Activator.CreateInstance()方法
- java反射获取类的类名、属性名、属性类型、方法、执行方法、构造函数
- 使用C#反射中的MakeGenericType函数,来为泛型方法和泛型类指定(泛型的)类型
- JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别 关于获取类的字段有两种方式:getFields()和getDeclaredFields()
- 关于PreparedStatement插入Date类型值的方法
- 关于PreparedStatement插入Date类型值的方法