Delphi 如何使用 rtti 获取记录中过程类型的详细信息
How to get details on procedure types in a record using rtti in Delphi
给定一个 Delphi 包含过程类型作为字段的记录,例如:
TProcType1 = function (index : integer; value : double) : string;
TProcType2 = function (bValue : boolean; ptr : TPointer) : integer;
TMyRecord = record
proc1 : TProcType1;
proc2 : TProcType2;
end
是否可以得到过程类型签名的详细信息?例如,proc1 被声明为具有两个参数(整数和双精度)和 return 类型的字符串的过程类型?
我可以在字段上使用 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?对于普通方法字段,这是可能的。
我可以保证记录只会包含过程类型字段。使用 Delphi 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
also has a Flags
property which is a set 告诉您参数的种类(例如 var
或 const
或 out
)。
TRttiProcedureType
can also tell you the procedure's calling convention.
给定一个 Delphi 包含过程类型作为字段的记录,例如:
TProcType1 = function (index : integer; value : double) : string;
TProcType2 = function (bValue : boolean; ptr : TPointer) : integer;
TMyRecord = record
proc1 : TProcType1;
proc2 : TProcType2;
end
是否可以得到过程类型签名的详细信息?例如,proc1 被声明为具有两个参数(整数和双精度)和 return 类型的字符串的过程类型?
我可以在字段上使用 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?对于普通方法字段,这是可能的。
我可以保证记录只会包含过程类型字段。使用 Delphi 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
also has a Flags
property which is a set 告诉您参数的种类(例如 var
或 const
或 out
)。
TRttiProcedureType
can also tell you the procedure's calling convention.