delphi 是否可以将未定义的方法调用作为参数传递?

wz8daaqr  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(105)

我想构建一个 Package 器函数来从JSON中提取数据并将其传递给方法。这样的事情

procedure THandler.MethodA(A,B:String)
begin
...
end;

procedure THandler.MethodB(A:String;B:Integer)
begin
...
end;

procedure THandler.MethodC(A,B,C:Integer)
begin
...
end;

procedure THandler.HandleCall(Data:tJSONObject;Handler:TUndefinedProc;Params:TArray<string>)
begin
 //read fields contained in "Params" from Data and pass them as variables to "Handler"
end

procedure THandler.CallA(Data:TJSONObject);
begin
 HandleCall(Data,MethodA,['param1','param2']);
end;

我现在看到两个挑战:如何将方法传递给HandleCall以及如何处理HandleCall内部未定义的参数数量。
这可能吗?

pes8fvy9

pes8fvy91#

是的。你可以将类型声明为函数或过程模板(事件处理程序就是这样定义的)。您还可以指定一个参数数组,以允许传递可变数量的参数(相同类型)。当然,你也可以用不同的参数声明不同的类型。
您不需要使用Rtti来实现这一点,但作为一个题外话,Rtti单元将其与Rtti类型TValue(可以容纳多种数据类型)一起使用,以提供 Package 器,允许使用Rtti来发现和调用您声明的任何内容。
您是否尝试过:

type
  TMultiStringCallback = procedure(const args: TArray<String>) of object;
  TMultiIntCallback = procedure(const args: TArray<int>) of object;

然后,如果你有一个包含这样一个函数的对象,你想调用:

TMyUsefulObject = class(TObject)
  protected
    procedure UsefulCallback(const args: TArray<String>); virtual;
    // ... etc
  end;

以及接受此类回调的处理程序:

TMyUsefulHandler = class(TObject)
  protected
    _fnCallback:    TMultiStringCallback;
  public
    property  OnCallback: TMultiStringCallback read _fnCallback write _fnCallback;
  end;

你可以通过像这样传递回调的地址来安装它:

procedure TMyUSefulObject.InstallcallbakInHanlder(AHandler: TMyUsefulHandler);
begin
  AHandler.OnCallback=Self.UsefulCallback;
end;

处理程序可以像这样调用它:

procedure TMyUsefulHandler.InvokeCallback(const args: TArray<String>);
begin
  if(Assigned(Self._fnCallback)) then
    Self._fnCallback(args);
end;

相关问题