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

如何使用RTTI获取Delphi类的有效构造函数(排除继承构造)

Delphi RTTI 过滤继承构造函数,仅获取自定义构造

要过滤掉从TObject继承的无参Create构造函数,只保留TMyObject自身定义的构造函数,核心是通过检查TRttiMethod的DeclaringType属性——该属性会返回方法最初被声明的类,只要它等于当前获取的TMyObject的RTTI类型,就说明是我们需要的构造函数。

修改后的代码示例:

var
  Context: TRttiContext;
  RttiType: TRttiType;
  Method: TRttiMethod;
begin
  Context := TRttiContext.Create;
  try
    RttiType := Context.GetType(TMyObject);
    for Method in RttiType.GetMethods('Create') do
    begin
      // 仅保留当前类声明的构造函数
      if (Method.IsConstructor) and (Method.DeclaringType = RttiType) then
      begin
        // 处理自定义构造函数
        // 比如输出参数信息
        Writeln('构造函数签名: ', Method.Name, ' 参数数量: ', Length(Method.GetParameters));
      end;
    end;
  finally
    Context.Free;
  end;
end;

关键说明

  • Method.DeclaringType:返回方法最初定义的类,这里只有TMyObject自己声明的两个构造函数,其DeclaringType才会等于RttiType(即TMyObject的RTTI实例),而继承自TObject的无参Create,其DeclaringType是TObject的RTTI类型,会被过滤掉。
  • 加上Method.IsConstructor是额外的严谨性检查,确保我们处理的确实是构造函数(虽然GetMethods('Create')返回的大多是构造函数,但避免意外情况)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:42:44