我想创建一个函数,将某个类的所有名称作为字符串列表返回。基于之前的解决方案/问题,我尝试使用此代码但没有成功
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/