如何获取TVirtualInterface的调用方法参数名称?

时间:2014-05-26 06:15:38

标签: delphi rtti

我想使用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;

1 个答案:

答案 0 :(得分:4)

Args不包含任何RTTI类型信息,但只是TValue的数组,其中包含传递给方法的实际参数值(TValue类似于变体)。

如果要查询有关参数类型的信息,可以使用传递给该方法的TRttiMethod来获取TRttiParameter数组,其中包含属性Name

var
  Arg : TRttiParameter;
...
for Arg in Method.GetParameters do
  Writeln(Arg.Name);