【发布时间】:2018-03-12 10:41:56
【问题描述】:
我正在为 Delphi 学习一个很棒的框架 mORMot,我发现很多有用的函数可以用 Variant(在 SynCommons 中)来处理。
现在我想更改Variant的一些属性名,但是搜索后我没有找到这样的功能,所以我决定写一个:
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 我写的可能效率不高,因为它需要同时执行delete 和add。看来直接修改TDocVariantData的VName成员是最有效的方式,但它是私有成员。
有什么建议吗?提前致谢。
BTW:mORMot官方论坛的邮件服务器好像有问题,我发帖的时候显示:
An error was encountered
Error: Could not connect to smtp host "217.70.184.11" (111) (Connection refused).
【问题讨论】:
-
我很好奇人们喜欢在没有任何理由的情况下投反对票。对帮助提问者下次改进问题没有帮助。
-
您无法使用变体创建新变量。您只能使用现有的变量名称。 .... 即使使用 RTTI,您也无法创建新的数据结构(我认为)。
-
感谢您的回复。我不想更改变量名称,而是变体中的属性名称。您知道一种类型的 Variant 可以具有属性,例如对象。 @Benedikt