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)
这是你在找什么?
使用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); 阅读要容易多少!因为我们只需要声明一次类型,所以我们在代码中傻傻地复制粘贴错误的可能性更小.
您没有看到的是 TValue 的设计方式。它专门作为一种包含值的方式,而不是转换它们的方式。如果您想在字符串和枚举之间进行转换,正如您所说,您已经知道如何做了。使用 TypeInfo 中为此目的提供的函数。
| 归档时间: |
|
| 查看次数: |
7853 次 |
| 最近记录: |