在here这个问题中,显示了一个用于创建与SetValue一起使用的兼容TValue的方法。我试图做出这个的通用版本,使用RTTI将类存储到INI文件中。这是我的削减代码:如何为枚举的RTTI字段创建一个通用TValue?
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获取字符串中的值的示例,并在以后再次放回。我还没有找到一个很好的教程,涵盖了这一点。
好的,一旦我停止在我的保存代码中的聪明,这工作得很好。要获取保存到INI的值,只需使用xField.GetValue(xObject).ToString; – mj2008