我有以name=value对的形式读到RESTful服务器的数据。
服务器代码有一个允许的"name"使用相应的Delphi类型,并且我希望转换"值"。部分(以字符串格式接收)转换为相应的TValue变量,该变量将在处理链中进一步使用。
没有设置一个大的if/else语句来测试"name"的映射类型;RTTI能帮上什么忙吗。我可以使用TRTTIContext的FindType方法获得映射类型的PTypeInfo,并且我可以看到一些接受PTypeInfo参数的TValue方法。
在这个阶段,我已经看了TValue。Cast和TValue。Make,但它们在将'10'转换为整数时失败。
我是否应该回到if/else方法并处理我需要处理的类型?
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;