Я хочу преобразовать строку в перечислимый тип с помощью 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;
Вы не видите того, как был разработан TValue. Он специально предназначен для хранения значений, а не для их преобразования. Если вы хотите преобразовать между srtings и enum, как вы сказали, вы уже знаете, как это сделать. Используйте функции, предоставленные для этой цели в TypeInfo.
Итак, вы знаете, как это сделать:
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;