TValue string<-->布尔来回

TValue string<-->Boolean back and forth

我正在玩 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;

但我无法从字符串转换回布尔值;我在第二行收到一个 Invalid Typecast 异常。

我正在使用 Delphi XE,但它在 Delphi Xe6 中的结果相同,这让我得出结论:我使用的 TValue 是错误的。

请问我做错了什么。

虽然您在问题中以 Boolean 为例,但我假设您真的对枚举类型的全部通用性感兴趣。否则你只需调用 StrToBool.

TValue 并非旨在执行您正在尝试的转换。最终,在底层,System.TypInfo 单元中的函数 GetEnumValueGetEnumName 是执行这些转换的函数。

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

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

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

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

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

旧版本的 Delphi 将 TRttiEnumerationType.GetValueTRttiEnumerationType.GetName 隐藏为私有方法。如果您使用的是 Delphi 这样的版本,那么您应该使用 GetEnumName.

TValue 并不意味着转换不兼容赋值的类型。它旨在在 RTTI 中传输值时保存值,并 遵守 Delphi.

的分配规则

只有 ToString 可以以某种字符串表示形式输出值,但是当使用 TValue.

时,您不能简单地将字符串分配给的类型也会失败

TValue 不是 Variant

如果要将字符串转换为布尔值并返回,请使用 StrToBoolBoolToStr