包裹函数在Delphi中调用泛型

时间:2014-07-11 07:00:15

标签: delphi generics delphi-xe2

我在一个被调用的类中有不同的函数。现在我想以通用方式实现自定义全局错误管理。

我的职能是:

function TTestClass.DoWorkA(parameter : String): boolean;
begin
  try
    result := internalClass.DoWorkA(parameter);
  except
    DoStuff();
  end;
end;

function TTestClass.DoWorkB(): String;
begin
  try
    result := internalClass.DoWorkB();
  except
    DoStuff();
  end;
end;

我必须在每个方法中插入try except块。该块不会改变,并且始终相同。现在我想以通用的方式解决这个问题(伪代码):

function TTestClass.DoWorkA(parameter : String): boolean;
begin
   result := DoWork<boolean>(internalClass.DoWorkA,parameter);
end;

function TTestClass.DoWorkB(): String;
begin
  result := DoWork<string>(internalClass.DoWorkB);
end;

function TTestClass.DoWork<T>(function : TFunction;parameter : TParameters): T;
begin
  try
     result := Call(function,parameter);
  except
    DoStuff();
  end;


end;

这样的事情浮现在脑海中,但我找不到用这个代码解决问题的方法。

有没有办法在delphi中实现这样的东西?

1 个答案:

答案 0 :(得分:4)

您可以使用泛型和匿名方法:

function TTestClass.DoWork<T>(Func: TFunc<T>): T;
begin
  try
    result := Func();
  except
    DoStuff();
  end;
end;

您可以像这样轻松打电话:

function TTestClass.DoWorkA(parameter : String): boolean;
begin
  result := DoWork<boolean>(
    function: Boolean
    begin
      Result := internalClass.DoWorkA(parameter);
    end;
  );
end;