更改变体 属性-名称 (Delphi)

Change Variant property-names (Delphi)

我正在为 Delphi 学习一个很棒的框架 mORMot,我发现有很多有用的函数可以用 Variant 处理(在 SynCommons 中)。

现在想改一个Variant的一些属性-names,但是搜索了一下没有找到这样的函数,所以决定写一个:

program Project7;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, SynCommons;

function VariantChangeNames(var V: Variant; const FromNames, ToNames: TRawUTF8DynArray): Boolean;
var
  Name: RawUTF8;
  PData: PDocVariantData;
  Val: Variant;
  i, k: Integer;
begin
  Result := False;
  PData := DocVariantData(V);
  i := 0;
  for Name in FromNames do
  begin
    k := PData^.GetValueIndex(Name);
    if k <> -1 then
    begin
      Val := PData^.Value[k];
      PData^.Value[ToNames[i]] := Val;
      PData^.Delete(k); // If delete before setting value, Val will be incorrect.
      Result := True;
    end;
    Inc(i);
  end;
end;

var
  V: Variant;
begin
  V := TDocVariant.New();
  V.Name := 'John';
  V.Age := 20;
  VariantChangeNames(V, ['Name'], ['RealName']);
  Writeln(VariantToString(V)); // {"Age":20,"RealName":"John"}
end.

VariantChangeNames 我写的可能效率不是很高,因为它需要同时做 deleteadd。貌似直接修改TDocVariantDataVName成员是最高效的方式,但它是私有成员

有什么建议吗?提前致谢。

BTW:mORMot官方论坛的邮件服务器好像有问题,当我post一个话题时,显示:

An error was encountered
Error: Could not connect to smtp host "217.70.184.11" (111) (Connection refused).

此问题已在 mORMot forum 中解决。