Delphi:如何在这个过程中传递一个对象和类作为参数(TMSAurelius)



我的类UserController中有一个过程,可以根据它们的ID删除TUser类的对象。我想创建一个GenericController类,以便能够对任何其他类执行此操作。这是我的程序:

procedure TUserController.DeleteUser(User: TUser);
begin
  if not FManager.IsAttached(User) then
    User := FManager.Find<TUser>(User.ID);
  FManager.Remove(User);
end;

我试过这样做:

procedure TGenericController.Delete(Class_: TObject; Class_ID: Integer);
    begin
      if not FManager.IsAttached(Class_) then
        Class_ := FManager.Find<Tclass(Class_)>(Class_ID);
      FManager.Remove(Class_);
    end;

但我收到这个错误:

[dcc32 Error] GenericController.pas(36): E2531 Method 'Find' requires explicit type argument(s)

这是从TMS Aurelius找到的方法:

function TObjectManager.Find<E>(IdValue: Variant): E;
begin
  Result := E(Find(TClass(E), IdValue));
end;

泛型在编译时解析,但Tclass(Class_)(可以替换为Class_.ClassType)直到运行时才知道,因此它不能用作泛型参数值。

更新:正如SirRufo试图在评论中解释的那样,你可以做更多这样的事情:

procedure TGenericController.Delete<E>(Obj: E; Obj_ID: Integer);
begin
  if not FManager.IsAttached(Obj) then
    Obj := FManager.Find<E>(Obj_ID);
  FManager.Remove(Obj);
end;

例如,如果TUserController源自TGenericController,那么DeleteUser()可以这样做:

procedure TUserController.DeleteUser(User: TUser);
begin
  inherited Delete<TUser>(User, User.ID);
end;

最新更新