Установка записи 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;
Другие вопросы по тегам