delphi - Delphi TValue.Make 从 RttiContext.FindType 与原始类型(整数,字符串,布尔)
问题描述
大家好,我想TValue
用TValue.Make
两个字符串做一个:
aNewValue := '1'; // value of TValue
aOldType := 'integer'; // Name of TValue.TypeInfo
TValue.Make
需要一个PTypeInfo
. 这个想法是 retrive TypeInfo
of aOldType
with TRttiContext.FindType
。TRttiContext.FindType
返回一个TRttiType
。TRttiType
有RttiType.Handle
返回一个PTypeInfo
。
这是我的代码,当我调用aRttiType.Handle
anAccess violation
时
var
aRttiContext: TRttiContext;
aRttiType: TRttiType;
aOldKey, aNewValue, aOldType, aNewType: string;
aValue: TValue;
ATypeInfo: PTypeInfo;
begin
aNewValue := '1';
aOldType := 'integer';
aRttiContext := TRttiContext.Create;
try
aRttiType := aRttiContext.FindType(aOldType);
ATypeInfo := aRttiType.Handle;
TValue.Make(@aNewValue, ATypeInfo, aValue);
aNewType := LowerCase(aValue.TypeInfo^.Name);
if aNewType <> aOldType then
raise Exception.CreateFmt('"%s" is "%s" expected "%s"', [aNewValue, aNewType, aOldType]);
finally
aRttiContext.Free;
end;
问题似乎aRttiContext.FindType('integer')
返回零
我如何获得原始类型(整数、字符串、布尔值)的类型(PTypeInfo)?
这行得通
TValue.Make(@aNewValue, TypeInfo(Integer), aValue);
但是如何使动态,例如:
TValue.Make(@aNewValue, GetTypeInfoWithMagic('Integer'), aValue);
解决方案
推荐阅读
- python - 如何在包含“@”符号的 cx_Oracle 中接受密码
- c# - 在gridview项目模板中将布尔转换为字符串
- php - Codeigniter MySQL 在布尔值上调用成员函数 real_escape_string()
- css - 在减小屏幕宽度的同时平滑增加元素宽度
- angular - Angular 共享模块导入不导入提到的模块
- ajax - Thymeleaf与ajax,如何传递参数
- kubernetes - 无法从 Kubernetes 集群中运行的不同 pod 访问 Vault 服务器
- powershell - add-content :输入对象不能绑定到命令的任何参数,因为
- angular - Angular Reactive Forms 重置值
- php - 无法在 linux CentOs 中执行 ExtJs 库 4 代码