Преобразование строки к перечислимому типу с помощью 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;

Это не работает. Это, должно быть что-то глупое, которое я не вижу - но я не сделал нашел его. Что я сделал неправильно?

Я знаю, как использовать 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;

Использование:

type 
  TEnumTest = (etFirst, etSecond);

var 
  D: TEnumTest;
begin
  D := TEnumUtils.GetAs<TEnumTest>('etFirst');
end;  
5
задан Fabricio Araujo 1 June 2011 в 21:02
поделиться

2 ответа

Вы не видите того, как был разработан TValue. Он специально предназначен для хранения значений, а не для их преобразования. Если вы хотите преобразовать между srtings и enum, как вы сказали, вы уже знаете, как это сделать. Используйте функции, предоставленные для этой цели в TypeInfo.

2
ответ дан 13 December 2019 в 05:33
поделиться

Итак, вы знаете, как это сделать:

function StrToEnumTest(aStr:String):TEnumTest;
begin
  result := TEnumTest(GetEnumValue(TypeInfo(TEnumTest),aStr));
end;

Но вы не хотите делать это таким образом? Почему? Я бы хотел, чтобы мы могли это сделать:

inline function StrToEnumTest(aStr:String):<T>;
begin
  result := <T>(GetEnumValue(TypeInfo(<T>),aStr));
end;
1
ответ дан 13 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: