在 Delphi 中,假设我有一个带有(非常简化的)签名的方法,如下所示:
procedure abc( const prop1:string; const arg1:TValue; const prop2:string;
out arg2:TValue );
我正在使用提供的参数构建这样的记录 TList
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)填充到类中的每个公共(public)属性“prop”中,调用类方法,然后提取所有公共(public)属性“prop”的值'(其中 io=ptOut)到 oVar 中。
输入端使用 RTTI 工作正常。
但是,我需要以某种方式保存对 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。
最佳答案
使用指针。它不必(实际上不应该)是“原始”指针。使用类型化指针PValue
。将 PValue
传递给您的函数,然后将其存储在 oVal
中,您还应该声明一个 PValue
。使用 @
创建指针,使用 ^
取消引用。
我不建议通过引用传递arg2
。尽管您仍然可以在其上使用 @
来获取指向传递给 abc
的原始变量的指针,但引用参数掩盖了该变量需要无限期保持可用的事实。相反,请将 arg2
声明为 PValue
,这样调用者就可以更明显地看出涉及间接性。
// declaration
procedure abc(...; arg2: PValue);
// call
abc(..., @somevar2);
关于Delphi - 推迟对输出参数的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15769580/