有没有人知道如何使用对原始数据的引用来制作 TValue?在我的序列化项目中,我使用(如 XML-Serialization 中建议的)一个通用序列化程序,它将 TValues 存储在内部树结构中(类似于示例中的 MemberMap)。
此成员树还应用于创建动态设置表单和操作数据。
我的想法是为数据定义一个属性:
TDataModel <T> = class
{...}
private
FData : TValue;
function GetData : T;
procedure SetData (Value : T);
public
property Data : T read GetData write SetData;
end;
GetData、SetData方法的实现:
procedure TDataModel <T>.SetData (Value : T);
begin
FData := TValue.From <T> (Value);
end;
procedure TDataModel <T>.GetData : T;
begin
Result := FData.AsType <T>;
end;
不幸的是,TValue.From 方法总是复制原始数据。因此,每当应用程序对数据进行更改时,DataModel 不会更新,反之亦然,如果我以动态形式更改我的 DataModel,则原始数据不受影响。
当然,我可以在更改任何内容之前和之后始终使用 Data 属性,但是由于我在我的 DataModel 中使用了很多 Rtti,我真的不想在任何时候都这样做。
也许有人有更好的建议?
最佳答案
TValue 旨在以非常紧凑的形式保存任何类型的数据,它并非旨在模拟“指针”。看看 RTTI.pas 单元:TValue 是一个 RECORD,它只有一个 TValueData 类型的数据成员。 TValueData 本身就是一个变体记录。
查看 TValueData,您将看到它除了最少量的数据之外什么都不保存:没有办法知道 TValue 来自哪里。
解决方案:不要在你的结构中保留一个 TValue,用一对 TRttiField + 一个 TObject 替换它。当你需要 TValue 时使用 TRttiField.GetValue(Instance),当你想设置一个值时使用 TRttiField.SetValue(Instance, AValue:TValue)。
关于delphi - Delphi 2010 中的 Rtti 数据操作和一致性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2771864/