Delphi TValue.Make from RttiContext.FindType with primitive types(integer,string,boolean)

时间:2018-05-31 14:20:18

标签: delphi

大家好,我想用两个字符串TValueTValue.Make进行对比:

aNewValue := '1';        // value of TValue 
aOldType  := 'integer';  // Name of TValue.TypeInfo

TValue.Make需要PTypeInfo。这个想法是TypeInfo aOldType TRttiContext.FindType的{​​{1}}。 TRttiContext.FindType返回TRttiTypeTRttiTypeRttiType.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);

0 个答案:

没有答案