大家好,我想用两个字符串TValue
与TValue.Make
进行对比:
aNewValue := '1'; // value of TValue
aOldType := 'integer'; // Name of TValue.TypeInfo
TValue.Make
需要PTypeInfo
。这个想法是TypeInfo
aOldType
TRttiContext.FindType
的{{1}}。 TRttiContext.FindType
返回TRttiType
。 TRttiType
有RttiType.Handle
返回PTypeInfo
。
这是我的代码,当我致电aRttiType.Handle
时,Access 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')
返回nil
我如何得到原始类型的类型(PTypeInfo)(整数,字符串,布尔值)?
这是有效的
TValue.Make(@aNewValue, TypeInfo(Integer), aValue);
但是如何制作动态,例如:
TValue.Make(@aNewValue, GetTypeInfoWithMagic('Integer'), aValue);