我正和TValue一起玩
我已将此代码编写在一个空白项目中:
uses
RTTI;
procedure TForm1.FormCreate(Sender: TObject);
var
s: string;
b: Boolean;
begin
s := TValue.From<Boolean > (True).ToString;
b := TValue.From<string > (s).AsType<Boolean>;
end;
但我无法从字符串转换回布尔值;我在第二行得到一个无效的Typecast异常。
我使用的是Delphi XE,但是在Delphi Xe6中也是如此,这导致我得出结论:我使用TValue是错误的。
那么请问我做错了什么。
答案 0 :(得分:5)
TValue
并不意味着转换不兼容分配的类型。它被设计为在RTTI中传输它们时保持值,并且尊重Delphi的赋值规则。
只有ToString
可以在某些字符串表示中输出值,但是使用TValue
执行此操作时,不能简单地指定字符串的类型也会失败。
TValue
不是Variant
。
如果您想将字符串转换为布尔值然后返回,请使用StrToBool
和BoolToStr
。
答案 1 :(得分:4)
虽然您在问题中以Boolean
为例,但我会假设您对枚举类型的完整通用性非常感兴趣。否则你只需拨打StrToBool
。
TValue
并非旨在执行您尝试的转化。最终,在较低级别,GetEnumValue
单元中的函数GetEnumName
和System.TypInfo
是执行这些转换的函数。
在现代版本的Delphi中,您可以使用TRttiEnumerationType
将文本转换为枚举类型值:
b := TRttiEnumerationType.GetValue<Boolean>(s);
你可以像这样向另一个方向移动:
s := TRttiEnumerationType.GetName<Boolean>(b);
这些方法分别通过调用GetEnumValue
和GetEnumName
来实现。
较早版本的Delphi将TRttiEnumerationType.GetValue
和TRttiEnumerationType.GetName
隐藏为私有方法。如果您使用的是此类版本的Delphi,则应使用GetEnumName
。