【发布时间】:2011-08-24 15:09:27
【问题描述】:
在问题here 中显示了一种创建兼容TValue 以与SetValue 一起使用的方法。我正在尝试制作一个通用版本,以使用 RTTI 将类存储到 INI 文件中。这是我的精简代码:
procedure TMyClass.LoadRTTI(xObject: TObject);
var
LContext: TRttiContext;
LClass: TRttiInstanceType;
xField : TRttiField;
szNewValue : String;
xValue : TValue;
begin
LContext := TRttiContext.Create;
LClass := LContext.GetType(xObject.ClassType) as TRttiInstanceType;
for xField in LClass.GetDeclaredFields do
begin
szNewValue := IniFile.ReadString(szSection, xField.Name, '');
if szNewValue <> '' then // emumerated will be '0' (zero) as that is what GetValue.AsString returns
begin
case xField.FieldType.TypeKind of
tkEnumeration: xValue := StrToIntDef(szNewValue, xField.GetValue(xObject).AsOrdinal);
end;
xField.SetValue(xObject, xValue); // FAILS HERE with 'Invalid calss typecast
end;
end;
end;
在引用的答案中,解决方案是使用 TValue.From() 方法获取值,但这似乎需要适当类型的变量。我没有这样的类型,因为我的代码不知道它是什么。
我正在寻找一个从 RTTI 获取字符串中的值的通用方法示例,然后再将其放回原处。我还没有找到一个很好的教程来涵盖这个。
【问题讨论】: