是否可以使用字符串调用过程?
Is it possible call a procedure using strings?
我需要调用很多名称递增的过程。是否可以在字符串中生成过程的名称,然后使用该字符串调用它? Python 有它自己的 exec
方法,这将是理想的,但如果我可以动态选择一个函数的名称,我会很好。
编辑:
为了详细说明这是为了什么,我必须编写一个性能测试来重复多个代码单元的过程。根据给定的参数,我可以有 100 个代码单元,每个代码单元包含 30 个过程,因此要调用所有这些,我目前必须显式调用它们中的每一个。
startTime := Time();
progressDialog.Update(1,'Proc0A');
for i := 1 to 1000 do begin
Set0_No0.Proc0A(1);
progressDialog.Update(2,i);
end;
timeElapsed := Time() - startTime;
if timeElapsed = 0 then begin
timeElapsed := 1;
end;
baseTime := timeElapsed;
FinishTest(timeElapsed, baseTime, 0, false, false, 1, 1, 1000);
startTime := Time();
progressDialog.Update(1,'Proc0B');
for i := 1 to 1000 do begin
Set0_No0.Proc0B(1);
progressDialog.Update(2,i);
end;
timeElapsed := Time() - startTime;
if timeElapsed = 0 then begin
timeElapsed := 1;
end;
FinishTest(timeElapsed, baseTime, 0, true, false, 1, 1, 1000);
相反,我希望它像这样工作:
procedure CallMethod(setNo:Integer; codeunitNo:Integer; procedureNo:Integer; type:Code[5]; repetitions:Integer)
begin
for i := 1 to repetitions do begin
Exec('Set%1_No%2.Proc%3%4(1)',setNo,codeunitNo,procedureNo,type);
Set0_No0.Proc0A(1);
progressDialog.Update(2,i);
end;
end;
您需要的功能在 AL 中不可用。
不过,您可以考虑以下几个选项:
- 结合使用
enums
、interfaces
和 codeunits
,您可以删除大量样板代码。
- 使用脚本(例如 PowerShell)您可以解析所有源文件,找到代码单元及其过程,然后生成调用每个过程的新代码单元。
我需要调用很多名称递增的过程。是否可以在字符串中生成过程的名称,然后使用该字符串调用它? Python 有它自己的 exec
方法,这将是理想的,但如果我可以动态选择一个函数的名称,我会很好。
编辑: 为了详细说明这是为了什么,我必须编写一个性能测试来重复多个代码单元的过程。根据给定的参数,我可以有 100 个代码单元,每个代码单元包含 30 个过程,因此要调用所有这些,我目前必须显式调用它们中的每一个。
startTime := Time();
progressDialog.Update(1,'Proc0A');
for i := 1 to 1000 do begin
Set0_No0.Proc0A(1);
progressDialog.Update(2,i);
end;
timeElapsed := Time() - startTime;
if timeElapsed = 0 then begin
timeElapsed := 1;
end;
baseTime := timeElapsed;
FinishTest(timeElapsed, baseTime, 0, false, false, 1, 1, 1000);
startTime := Time();
progressDialog.Update(1,'Proc0B');
for i := 1 to 1000 do begin
Set0_No0.Proc0B(1);
progressDialog.Update(2,i);
end;
timeElapsed := Time() - startTime;
if timeElapsed = 0 then begin
timeElapsed := 1;
end;
FinishTest(timeElapsed, baseTime, 0, true, false, 1, 1, 1000);
相反,我希望它像这样工作:
procedure CallMethod(setNo:Integer; codeunitNo:Integer; procedureNo:Integer; type:Code[5]; repetitions:Integer)
begin
for i := 1 to repetitions do begin
Exec('Set%1_No%2.Proc%3%4(1)',setNo,codeunitNo,procedureNo,type);
Set0_No0.Proc0A(1);
progressDialog.Update(2,i);
end;
end;
您需要的功能在 AL 中不可用。
不过,您可以考虑以下几个选项:
- 结合使用
enums
、interfaces
和codeunits
,您可以删除大量样板代码。 - 使用脚本(例如 PowerShell)您可以解析所有源文件,找到代码单元及其过程,然后生成调用每个过程的新代码单元。