delphi - 使用 RTTI 从已知类型在 Delphi 中设置 TValue 记录
问题描述
我有以名称=值对的形式读入 RESTful 服务器的数据。
服务器代码具有允许的“名称”与相应的 Delphi 类型的映射,我希望将“值”部分(以字符串格式接收)转换为相应的 TValue 变量,该变量将在处理链中进一步使用。
如果没有设置一个大的 if/else 语句来测试“名称”的映射类型,那么 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;
推荐阅读
- flutter - 有没有办法在轮播中添加许多 yt 视频并在 Flutter 中水平滑动(延迟加载)?
- postgresql - postrges 中大型查询字符串的优化
- node.js - 为什么我收到错误 mongo.db 聚合?
- java - 有效的 XML Unicode 字符
- python - 当我尝试在 Python3 的函数中打印全局变量时出错
- shader - 如何使用 HLSL 着色器裁剪和显示纹理表的特定图块?
- c - 使用 15 的 windowBits 膨胀 zlib 包装的数据总是可以的吗?
- dependency-injection - 依赖注入 - .Net MVC 5 webapps 的实例生命周期 - Unity Container
- google-apps-script - 谷歌表格如何通过表格循环多个单元格?
- r - 排除管道中向量中的多个值