2011-08-30 29 views
3

我想在Delphi中序列化一个对象,并使用新的RTTI。但是当我从存储中加载值时,它们被作为字符串retreived,s和TRttiProperty.SetValue需要一个TValue作为第二个参数。因此,当我将声明为double的属性的值设置为'5.1'或'5'时会引发异常。我也尝试使用TValue.From()方法,但没有成功。当我将值作为字符串时,如何为非字符串属性调用TRttiProperty.SetValue?

这是一段代码,它解释事情出错的地方。

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

@Rob:看起来他正在读序列化为文本的数字并尝试对它们进行反序列化,而且他对字符串 - >数字类型缺乏隐式转换感到困惑。 –

+0

编辑这个问题,为我要求的内容添加一个说明。 – zz1433

回答

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; 

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

+0

是的,这个伎俩。非常感谢! – zz1433

相关问题