TValue字符串< - >布尔来回

时间:2015-01-13 08:55:29

标签: delphi delphi-xe rtti

我正和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是错误的。

那么请问我做错了什么。

2 个答案:

答案 0 :(得分:5)

TValue并不意味着转换不兼容分配的类型。它被设计为在RTTI中传输它们时保持值,并且尊重Delphi的赋值规则

只有ToString可以在某些字符串表示中输出值,但是使用TValue执行此操作时,不能简单地指定字符串的类型也会失败。

TValue不是Variant

如果您想将字符串转换为布尔值然后返回,请使用StrToBoolBoolToStr

答案 1 :(得分:4)

虽然您在问题中以Boolean为例,但我会假设您对枚举类型的完整通用性非常感兴趣。否则你只需拨打StrToBool

TValue并非旨在执行您尝试的转化。最终,在较低级别,GetEnumValue单元中的函数GetEnumNameSystem.TypInfo是执行这些转换的函数。

在现代版本的Delphi中,您可以使用TRttiEnumerationType将文本转换为枚举类型值:

b := TRttiEnumerationType.GetValue<Boolean>(s);

你可以像这样向另一个方向移动:

s := TRttiEnumerationType.GetName<Boolean>(b);

这些方法分别通过调用GetEnumValueGetEnumName来实现。

较早版本的Delphi将TRttiEnumerationType.GetValueTRttiEnumerationType.GetName隐藏为私有方法。如果您使用的是此类版本的Delphi,则应使用GetEnumName