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

