在 Delphi 中,假设我有一个带有(非常简化的)签名的方法,如下所示:
procedure abc( const prop1:string; const arg1:TValue; const prop2:string;
out arg2:TValue );
我正在使用提供的参数构建这样的记录的 TList<PPropValPair> :
type
TPVPType = (ptIn, ptOut);
PPropValPair = ^TPropValPair;
TPropValPair = record
io : TPVPType;
prop : string; // property name
iVal : TValue; // input value
oVar : Variant; // <-- how to save for later use??? Variant? TValue?
end;
(从表面上看,这个例子看起来很傻。同样,它只是为了传达问题而非常简化。)
在运行时,我想将所有输入值 ival(其中 io=ptIn)填充到类中的每个公共属性“prop”中,调用类方法,然后提取所有公共属性“prop”的值(其中io=ptOut) 到 oVar。
输入端使用 RTTI 工作正常。
但是,我需要以某种方式将 REFERENCE 保存到 oVar 中的输出变量,以便在调用类方法后保存关联属性的值。
我没有直接为 arg2 分配任何东西。相反,我保存了对 arg2 的引用并稍后间接分配该值。
诀窍是......我不想对 abc(...) 中的输出参数做任何额外的注释。
在 C++ 中,您可以通过在参数前面加上“&”来将参数声明为“引用”。因此,在 C++ 术语中,这可能大致定义为:
procedure abc( arg1 : TValue; &arg2 : TValue );
稍后,您可以参考 &arg2 ,它使用指向对象的指针。但是在调用该函数时,您只需说:
abc( somevar1, somevar2 );
somevar1 通过值传递, somevar2 通过引用传递。在函数内部,我可以将 somevar2 保存在引用 var 中,然后稍后通过说 &arg2ref = 'abc' 通过指针(如果它是一个字符串)为其分配一个值。
我猜在 Delphi 中有一种方法可以做到这一点,或者使用 Variant 作为 oVar 类型,或者使用 RTTI,或者其他东西。我只是还没有弄清楚碎片的神奇组合。(我只是在 Delphi 中不经常使用指针。)
也许我需要在 oVar 中保存一个原始指针以及类型(比如 oType),并通过指针转换一个值来保存属性的值?
我希望这里有人可能有一些明确的想法。
顺便说一句,我正在使用 Delphi XE3。