我有幾個班,(整數,布爾,字符串)和一些可空的簡單類型的屬性:德爾福RTTI迭代通用的記錄類型的屬性
Nullable<T> = record
private
FValue: T;
FHasValue: IInterface;
function GetValue: T;
function GetHasValue: Boolean;
public
constructor Create(AValue: T);
property HasValue: Boolean read GetHasValue;
property Value: T read GetValue;
end;
EG。
TMyClass1 = class(TCommonAncestor)
private
FNumericvalue: Double;
FEventTime: Nullable<TDateTime>;
public
property NumericValue: Double read FNumericValue write FNumericValue;
property EventTime: Nullable<TDateTime> read FEventTime write FEventTime;
end;
和
TMyClass2 = class(TCommonAncestor)
private
FCount: Nullable<Integer>;
FName: string;
public
property Count: Nullable<Integer> read FCount write FCount;
property Name: string read FName write FName;
end;
等....
鑑於TCommonAncestor的後裔,我想用RTTI來遍歷所有的公共屬性,並列出他們的名字和值,除非它是T.HasValue返回false的可空。
我正在使用Delphi XE2。
編輯:增加了我到目前爲止。在XE2我
procedure ExtractValues(Item: TCommonAncestor);
var
c : TRttiContext;
t : TRttiType;
p : TRttiProperty;
begin
c := TRttiContext.Create;
try
t := c.GetType(Item.ClassType);
for p in t.GetProperties do
begin
case p.PropertyType.TypeKind of
tkInteger:
OutputDebugString(PChar(Format('%se=%s', [p.Name,p.GetValue(Item).ToString]));
tkRecord:
begin
// for Nullable<Double> p.PropertyType.Name contains 'Nullable<System.Double>'
// but how do I go about accessing properties of this record-type field?
end;
end;
end;
finally
c.Free;
end;
end;
而你嘗試過什麼迄今爲止解決這個問題?公共屬性不能通過傳統的RTTI('System.TypInfo'單位)訪問,所以你必須使用擴展RTTI('System.Rtti'單位) –
我修改了我的問題來表明我正在嘗試使用System.Rtti – TheRoadrunner
使用RTTI訪問記錄屬性是不可能的。你將不得不去記錄字段。 –