如何通过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
相关产品推荐
相关产品推荐

