Установка записи TValue в Delphi из известного типа с RTTI
У меня есть данные, которые считываются на сервер RESTful в виде пар имя=значение.
Код сервера имеет сопоставление разрешенного «имени» с соответствующим типом Delphi, и я хочу преобразовать часть «значение» (которая получена в строковом формате) в соответствующую переменную TValue, которая используется дальше в цепочке обработки.
Если не считать настройки большого оператора if/else, который проверяет сопоставленный тип «имени», есть ли какой-либо способ, которым может помочь RTTI. Я могу получить PTypeInfo сопоставленного типа, используя метод FindType TRTTIContext, и я вижу некоторые методы TValue, которые принимают параметр PTypeInfo.
На этом этапе я просмотрел TValue.Cast и TValue.Make, но они терпят неудачу при преобразовании «10» в целое число.
Должен ли я просто вернуться к подходу if/else и обрабатывать типы, с которыми мне нужно иметь дело?
1 ответ
TValue
представляет те же неявные приведения типов, которые поддерживает компилятор. Например,
Int16<->Integer
, но нет
String<->Integer
. Эти добрые преобразования, вы должны сделать сами
Я бы, наверное, сделал что-то вроде этого:
type
ConvFunc = function(const Value: String): TValue;
function ConvToInt(const Value: String): TValue;
begin
Result := StrToInt(Value);
end;
// other conversion functions as needed...
var
Dict: TDictionary<String, ConvFunc>;
Func: ConvFunc;
Value: TValue;
begin
Dict := TDictionary<String, ConvFunc>.Create;
Dict.Add('name', @ConvToInt);
// add other entries as needed...
...
if not Dict.TryGetValue('NameToFind', Func) then
begin
// name is not supported...
end else
begin
try
Value := Func('InputToConvert');
// use Value as needed...
except
// input is not supported...
end;
end;
...
Dict.Free;
end;