【问题标题】:Delphi RTTI TVirtualMethodInterceptor.Create doesn't support the class that has overload virtual methodDelphi RTTI TVirtualMethodInterceptor.Create 不支持具有重载虚方法的类
【发布时间】:2015-01-06 02:48:16
【问题描述】:

我发现 TVirtualMethodInterceptor.Create 不支持具有重载虚方法的类。 举例

type
  TLog = class
  public
    constructor Create();

    procedure SaveLog(str: string); overload; virtual;
    procedure SaveLog(str: string; Args: array of const); overload;  virtual;
  end;

constructor TLog.Create(str: string);
begin

end;

procedure TLog.SaveLog(str: string);
begin

end;

procedure TLog.SaveLog(str: string; Args: array of const);
begin

end;


procedure MyTest();
var
  ttt: TLog;
  vmi: TVirtualMethodInterceptor;

begin
  ttt:=TLog.Create();
  try
    vmi:=TVirtualMethodInterceptor.Create(ttt.ClassType);
    try
      //
    finally
      vmi.Free();
    end;
  finally
    ttt.Free();
  end;
end;

在执行 TVirtualMethodInterceptor.Create() 时,会引发异常“RTTI 不足,无法支持此操作”。 有人可以帮帮我吗?

【问题讨论】:

    标签: delphi delphi-xe3 rtti


    【解决方案1】:

    产生此消息是因为您的类的方法的某些参数未发出 RTTI 信息。这个方法就是这样的

     procedure SaveLog(str: string; Args: array of const); overload;  virtual; //array of const - doesn't emit rtti info.
    

    用这个替换

    type
     TConst = array of TVarRec; //this type has rtti information 
     ...
     ...
     procedure SaveLog(str: string; Args: TConst); overload;  virtual; 
    

    【讨论】:

    • 感谢您的回复,但我遇到了另一个问题。请参阅RTTI & Variant Open Array Parameters
    • TConst 不是一个变体开放数组参数,它是一个简单的动态数组(TVarRec 的)。所以把它当作一个 dynarray 而不是一个开放的数组参数,一切都很好。
    • 我认为真正的问题是 Delphi RTTI 不支持带有开放数组参数的方法。
    • RTTI 是否支持开放数组参数,但可能不支持变体开放数组参数?
    • 我已经测试了“整数数组”和“常量数组”。我得到了同样的例外。顺便说一句,我在使用 Delphi Mocks 实现单元测试代码时发现了这个问题。所以这个问题不仅是 Delphi RTTI 问题,也是 Delphi Mocks 问题。如果你创建了具有开放数组参数方法的 Mock 对象,你会得到同样的异常。
    猜你喜欢
    • 2011-05-18
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多