我想使用TVirtualInterface调用动态方法。 调用方法时,我需要参数名称。怎么弄? 我没有任何问题地获得值和类型。
TSimple = class(TVirtualInterface)
constructor Create(PIID: PTypeInfo);
procedure DoInvoke(Method: TRttiMethod; const Args: TArray<TValue>; out Result: TValue);
end;
constructor TSimple.Create(PIID: PTypeInfo);
begin
inherited Create(PIID, DoInvoke);
end;
procedure TSimple.DoInvoke(Method: TRttiMethod;
const Args: TArray<TValue>; out Result: TValue);
var
Arg: TValue;
ArgType, ArgName: string;
TempKind: TTypeKind;
begin
Write('You called the ', Method.Name, ' method ');
if Length(Args) > 1 then begin
Writeln('and it has ', Length(Args) - 1,' parameters:');
for Arg in Args do begin
TempKind := Arg.Kind;
if TempKind <> tkInterface then begin
ArgName := Arg.ToString; <<---- Shows : '(TypeName @ 029011B0)' not Name.
ArgType := Arg.TypeInfo.Name;
Writeln(ArgName, ' which is of the type ', ArgType);
end;
end;
end else begin
Writeln(' and it has no parameters.');
end;
end;
答案 0 :(得分:4)
Args
不包含任何RTTI类型信息,但只是TValue
的数组,其中包含传递给方法的实际参数值(TValue
类似于变体)。
如果要查询有关参数类型的信息,可以使用传递给该方法的TRttiMethod
来获取TRttiParameter
数组,其中包含属性Name
:
var
Arg : TRttiParameter;
...
for Arg in Method.GetParameters do
Writeln(Arg.Name);