当我将值作为字符串时,如何为非字符串属性调用TRttiProperty.SetValue?

时间:2011-08-30 18:18:40

标签: delphi rtti

我想在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.

编辑:问题是如何使用字符串数据类型设置非字符串类型的属性的值,但包含有效数据。 (如上述情况)

1 个答案:

答案 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;

这显然不是成品,但它应该足以让你开始。