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

zz1*_*433 3 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.
Run Code Online (Sandbox Code Playgroud)

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

Mas*_*ler 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;
Run Code Online (Sandbox Code Playgroud)

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