使用TValue将字符串转换为枚举类型?

Fab*_*ujo 5 delphi rtti delphi-2010 tvalue

我想使用TValue将字符串转换为枚举类型,我用谷歌搜索但我没有找到如何做到这一点.

type 
  TEnumTest = (etFirst, etSecond);

var 
  D: TEnumTest;
begin
  D := StrToENumTest('etFirst');
end;

function StrToEnumTest(pStr:String):TEnumTest;
var 
  V: TValue;
begin
  V := TValue.From<String>(pstr);
  Result := V.AsType<TEnumTest>;
end;
Run Code Online (Sandbox Code Playgroud)

它不起作用.那肯定是我看不到的蠢事 - 但我没有找到它.我做错了什么?

我知道如何使用GetEnumValue.

编辑:@Warren,它在这里,因为这更容易发布代码:

  TEnumUtils = class
    class function GetAs<T>(pValor: String): T;
  end;

class function TEnumUtils.GetAs<T>(pValor: String): T;
var
  Tipo: PTypeInfo;
  Temp: Integer;
  PTemp: Pointer;

begin
   Tipo := TypeInfo(T);
   Temp := GetEnumValue(Tipo, pValor);
   PTemp := @Temp;
   Result := T(PTemp^);
end;
Run Code Online (Sandbox Code Playgroud)

用法:

type 
  TEnumTest = (etFirst, etSecond);

var 
  D: TEnumTest;
begin
  D := TEnumUtils.GetAs<TEnumTest>('etFirst');
end;  
Run Code Online (Sandbox Code Playgroud)

Bah*_*haa 5

这是你在找什么?

使用Generics和RTTI获取枚举字符串名称或枚举值

使用Generics/RTTI Unit System.RTTI进行枚举转换是跨平台的,包含一个很好的类,用于将枚举转换为字符串和返回:TRttiEnumerationType

TRttiEnumerationType类有两个类函数(可以在不创建类实例的情况下调用的方法),它们清理使用TypInfo方法所需的代码.这些方法声明的简易阅读版本是:

class function GetName(AValue:T):string; class function GetValue(AName:string):T; 注意这些方法使用泛型(即T位).泛型非常酷,因为它们允许您编写一次功能,然后在代码中的不同时间使用不同类型的功能.

在这种情况下,TRttiEnumerationType的泛型方法仅用于Enums而不是其他类类型,因为定义的功能特定于Enum.

在将RTTI添加到用途后立即转换TCompass枚举将如下所示.

S:= TRttiEnumerationType.GetName(D); ShowMessage(S); 从字符串转换回来也更简单.

D:= TRttiEnumerationType.GetValue(S); 阅读要容易多少!因为我们只需要声明一次类型,所以我们在代码中傻傻地复制粘贴错误的可能性更小.


Mas*_*ler 3

您没有看到的是 TValue 的设计方式。它专门作为一种包含值的方式,而不是转换它们的方式。如果您想在字符串和枚举之间进行转换,正如您所说,您已经知道如何做了。使用 TypeInfo 中为此目的提供的函数。