delphi - 如何在Delphi中使用rtti获取记录中过程类型的详细信息

标签 delphi rtti

给定一个包含过程类型作为字段的 Delphi 记录,例如:

TProcType1 = function (index : integer; value : double) : string;
TProcType2 = function (bValue : boolean; ptr : TPointer) : integer; 
TMyRecord = record
   proc1 : TProcType1;
   proc2 : TProcType2;
end

是否可以获得过程类型签名的详细信息?例如,proc1 被声明为具有两个参数(整数和 double )以及字符串返回类型的过程类型?

我可以在字段上使用 ToString 将过程类型字段转换为字符串,并解析它以获取信息,例如,使用以下代码:

 context := TRttiContext.Create;
 rtype := context.GetType(TypeInfo(TMyRecord));
 fields := rtype.GetFields;
 for i := 0 to High(fields) do
     begin
     astr := fields[i].FieldType.ToString;
     // parse astr to get info on procedure type
     end

我想知道是否有任何方法可以使用 rtti 解构过程类型,而不必手动解析为 ToString?对于普通方法字段,这是可能的。

我可以保证该记录将仅包含过程类型字段。使用德尔福10.4

最佳答案

是的,这相当简单:

var
  Context: TRttiContext;
  RType: TRttiType;
  Field: TRttiField;
  p: TRttiProcedureType;
  param: TRttiParameter;
begin
  Context := TRttiContext.Create;
  RType := Context.GetType(TypeInfo(TMyRecord));
  for Field in RType.GetFields do
  begin
    if Field.FieldType is TRttiProcedureType then
    begin
      p := TRttiProcedureType(Field.FieldType);
      Writeln(p.Name);
      Writeln('Parameter count: ', Length(p.GetParameters));
      for param in p.GetParameters do
      begin
        Writeln('Parameter name: ', param.Name);
        if Assigned(param.ParamType) then
          Writeln('Parameter type: ', param.ParamType.ToString);
      end;
      if Assigned(p.ReturnType) then
        Writeln('Result type: ', p.ReturnType.ToString);
      Writeln;
    end;
  end;
end;

输出:

TProcType1
Parameter count: 2
Parameter name: index
Parameter type: Integer
Parameter name: value
Parameter type: Double
Result type: string

TProcType2
Parameter count: 2
Parameter name: bValue
Parameter type: Boolean
Parameter name: ptr
Parameter type: Pointer
Result type: Integer

TRttiParameter还有一个Flags属性是 set它告诉您参数的类型(例如 varconstout)。

TRttiProcedureType还可以告诉你程序的calling convention .

关于delphi - 如何在Delphi中使用rtti获取记录中过程类型的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62745782/

相关文章:

c++ - 动态转换的一些 'good use' 示例是什么?

delphi - 写入文本文件的中间

android - DELPHI XE5 如何在 ANDROID 中发送带送达通知的短信

delphi - 编译器提示 : "Inline function ' . 。 .' has not been expanded..."

c++ - LLVM:如何找出使用的是哪种类型?

delphi - 使用 RTTI 获取/设置子属性

c++ - C++ RTTI 是否始终适用于所有平台?

c++ - 在没有 RTTI 的情况下检查 std::any 的类型

delphi - Delphi 7 使用 DOM 时发生访问冲突错误

python - 读取 Windows 文件而不阻止其他进程写入该文件