我正和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错误.
那么请问我做错了什么.
解决方法
虽然您在问题中给出了布尔值作为示例,但我将假设您真正对枚举类型的完整通用性感兴趣.否则你只需要调用StrToBool.
TValue不是为了执行您尝试的转换而设计的.最终,在低级别,System.TypInfo单元中的函数GetEnumValue和GetEnumName是执行这些转换的函数.
在现代版本的Delphi中,您可以使用TRttiEnumerationType
将文本转换为枚举类型值:
b := TRttiEnumerationType.GetValue<Boolean>(s);
您可以像这样向另一个方向移动:
s := TRttiEnumerationType.GetName<Boolean>(b);
这些方法分别通过调用GetEnumValue和GetEnumName来实现.
较旧版本的Delphi将TRttiEnumerationType.GetValue和TRttiEnumerationType.GetName隐藏为私有方法.如果您使用的是此类版本的Delphi,则应使用GetEnumName.