gpt4 book ai didi

delphi - 我可以将类类型作为过程参数传递吗

转载 作者:行者123 更新时间:2023-12-03 15:18:24 24 4
gpt4 key购买 nike

我想创建一个函数,以字符串列表的形式返回某个类的所有名称。根据之前的解决方案/问题,我尝试使用此代码但没有成功

function  GetClassElementNames (TObject ) : TStringlist ;
var
LCtx : TRttiContext;
LMethod : TRttiMethod;
begin
try
LCtx:=TRttiContext.Create;
try
// list the methods for the any class class
for LMethod in LCtx.GetType(TObject).GetMethods do
result.add(LMethod.Name);
finally
LCtx.Free;
end;
except
on E: Exception do
result.add (E.ClassName + ': ' + E.Message);
end;
end;

最佳答案

使用 TClass 来实现,这是 TRttiContent.GetType() 所期望的。

在填充结果之前,您也不会分配结果。

试试这个:

function GetClassElementNames(Cls: TClass) : TStringlist ;
var
LCtx : TRttiContext;
LMethod : TRttiMethod;
begin
Result := TStringList.Create;
try
LCtx := TRttiContext.Create;
try
for LMethod in LCtx.GetType(Cls).GetMethods do
Result.Add(LMethod.Name);
finally
LCtx.Free;
end;
except
on E: Exception do
Result.Add(E.ClassName + ': ' + E.Message);
end;
end;

var
Methods: TStringList;
begin
Methods := GetClassElementNames(TSomeClass);
try
...
finally
Methods.Free;
end;
end;

如果您想传递对象实例而不是类类型,可以像这样包装 GetClassElementNames():

function GetObjectElementNames(Object: TObject): TStringList;
begin
Result := GetClassElementNames(Object.ClassType);
end;

话虽如此,返回新的 TStringList 对象并不是一个好主意。如果调用者分配 TStringList 并将其传递给函数来填充,则更好,更灵活,例如:

procedure GetClassElementNames(Cls: TClass; AMethods: TStrings);
var
LCtx : TRttiContext;
LMethod : TRttiMethod;
begin
try
LCtx := TRttiContext.Create;
try
for LMethod in LCtx.GetType(Cls).GetMethods do
AMethods.Add(LMethod.Name);
finally
LCtx.Free;
end;
except
on E: Exception do
AMethods.Add(E.ClassName + ': ' + E.Message);
end;
end;

{
procedure GetObjectElementNames(Object: TObject; AMethods: TStrings);
begin
GetClassElementNames(Object.ClassType, AMethods);
end;
}

var
Methods: TStringList;
begin
Methods := TStringList.Create;
try
GetClassElementNames(TSomeClass, Methods);
...
finally
Methods.Free;
end;
end;

关于delphi - 我可以将类类型作为过程参数传递吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19063916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com