我想在Delphi中序列化一个Object,而我正在使用新的RTTI。但是当我从存储中加载值时,它们将被转换为字符串,s和TRttiProperty.SetValue需要TValue作为第二个参数。因此,当我将声明为double的属性的值设置为“5.1”或“5”
时,会引发异常我也尝试使用TValue.From()
方法但没有成功。
这是一段代码,解释了出错的地方。
var P: TRttiProperty;
....
// P now is the property which is declared as a double or integer
P.SetValue(Self, '3'); //<-- this raises an exception.
编辑:问题是如何使用字符串数据类型设置非字符串类型的属性的值,但包含有效数据。 (如上述情况)
答案 0 :(得分:6)
是的,您正在尝试将“3”(字符串)分配给数字属性。 RTTI系统没有 隐式类型转换。尝试这样的事情:
procedure DeserializeProperty(P: TRttiProperty; s: string);
var
v: TValue;
begin
case p.PropertyType.TypeKind of
tkInteger: v := StrToInt(s);
tkFloat: v := StrToFloat(s);
tkString: v := s;
end;
p.SetValue(self, v);
end;
这显然不是成品,但它应该足以让你开始。