【问题标题】:Delphi: How to pass a object and class as parameter in this procedure (TMS Aurelius)?Delphi:如何在此过程(TMS Aurelius)中将对象和类作为参数传递?
【发布时间】:2014-09-28 01:03:55
【问题描述】:

我在我的 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;

【问题讨论】:

    标签: delphi orm procedure rtti tms


    【解决方案1】:

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

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

    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;
    

    【讨论】:

    • 你推荐另一种方法吗?
    • 对方法procedure TGenericController.Delete&lt;E&gt;(IdValue: Variant); var LInst : E; ... LInst := FManager.Find&lt;E&gt;(IdValue); ...也使用泛型
    • @SirRufo 我没有成功,仍然是同样的错误。 Find 需要一个类类型。
    • @Artur_Indio:在 SirRufo 的示例中,Find() 将从您必须传递给 Delete() 的通用参数中获取其类类型。
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2020-02-21
    • 2012-03-30
    • 2013-08-09
    • 2020-06-10
    相关资源
    最近更新 更多