Delphi 如何使用 RTTI 获取 属性 的默认值
Delphi How to get default value for property using RTTI
如果我有这样的class:
TServerSettings = class(TSettings)
strict private
FHTTPPort : Integer;
published
property HTTPPort : Integer read FHTTPPort write FHTTPPort default 80;
end;
如何使用 RTTI 获取 HTTPPort
属性 的 default
属性?
像这样:
{$APPTYPE CONSOLE}
uses
System.TypInfo;
type
TMyClass = class
strict private
FMyValue: Integer;
published
property MyValue: Integer read FMyValue default 42;
end;
var
obj: TMyClass;
PropInfo: PPropInfo;
begin
obj := TMyClass.Create;
PropInfo := GetPropInfo(obj, 'MyValue');
Writeln(PropInfo.Default);
end.
请注意,class 与您问题中的情况一样,已损坏。创建实例时,系统不会自动将属性初始化为默认值。您需要为此 class 添加一个构造函数才能做到这一点。
您可以使用 Default
属性 的 TRttiInstanceProperty
class
{$APPTYPE CONSOLE}
{$R *.res}
uses
Rtti,
System.SysUtils;
type
TServerSettings = class
strict private
FHTTPPort : Integer;
published
property HTTPPort : Integer read FHTTPPort write FHTTPPort default 80;
end;
var
L : TRttiType;
P : TRttiProperty;
begin
try
P:= TRttiContext.Create.GetType(TServerSettings.ClassInfo).GetProperty('HTTPPort');
if P is TRttiInstanceProperty then
Writeln(TRttiInstanceProperty(P).Default);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
如果我有这样的class:
TServerSettings = class(TSettings)
strict private
FHTTPPort : Integer;
published
property HTTPPort : Integer read FHTTPPort write FHTTPPort default 80;
end;
如何使用 RTTI 获取 HTTPPort
属性 的 default
属性?
像这样:
{$APPTYPE CONSOLE}
uses
System.TypInfo;
type
TMyClass = class
strict private
FMyValue: Integer;
published
property MyValue: Integer read FMyValue default 42;
end;
var
obj: TMyClass;
PropInfo: PPropInfo;
begin
obj := TMyClass.Create;
PropInfo := GetPropInfo(obj, 'MyValue');
Writeln(PropInfo.Default);
end.
请注意,class 与您问题中的情况一样,已损坏。创建实例时,系统不会自动将属性初始化为默认值。您需要为此 class 添加一个构造函数才能做到这一点。
您可以使用 Default
属性 的 TRttiInstanceProperty
class
{$APPTYPE CONSOLE}
{$R *.res}
uses
Rtti,
System.SysUtils;
type
TServerSettings = class
strict private
FHTTPPort : Integer;
published
property HTTPPort : Integer read FHTTPPort write FHTTPPort default 80;
end;
var
L : TRttiType;
P : TRttiProperty;
begin
try
P:= TRttiContext.Create.GetType(TServerSettings.ClassInfo).GetProperty('HTTPPort');
if P is TRttiInstanceProperty then
Writeln(TRttiInstanceProperty(P).Default);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.