You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过TRttiMethod获取类方法的定义类?

如何通过TRttiMethod获取方法的定义类

要获取TRttiMethod实际定义的类,直接使用TRttiMethod的DeclaringType属性即可,它会返回该方法最初被声明的类的TRttiType对象,而非你搜索时的派生类。

针对你给出的代码示例,修改后实现如下:

TBase = class
public
  class procedure Write;
end;

THigher = class(TBase);

var 
  Context: TRttiContext;
  T: TRttiType;
  Method: TRttiMethod;
begin
  Context := TRttiContext.Create;
  try
    T := Context.GetType(THigher);
    Method := nil;
    for var Item in T.GetMethods('Write') do
      if (Item.MethodKind = TMethodKind.mkClassProcedure) then
      begin
        Method := Item;
        // 获取定义该方法的基类
        var DeclaringClassType := Method.DeclaringType;
        ShowMessage(DeclaringClassType.Name); // 输出 'TBase'
        // 若要获取元类实例,可使用:
        // var DeclaringMetaClass := TRttiInstanceType(DeclaringClassType).MetaclassType;
        break;
      end;
  finally
    Context.Free;
  end;
end;

补充说明

  • 如果派生类覆盖了基类的方法,DeclaringType会返回派生类的类型,因为此时方法的定义已被派生类重新声明。
  • 对于多层继承的场景,DeclaringType依然能精准指向方法最初被定义的类,无需手动遍历继承链。

内容的提问来源于stack exchange,提问作者Richard Shuck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:25:04