1

クラス 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 の Find メソッドです。

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

1 に答える 1

2

ジェネリックはコンパイル時に解決されますが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;
于 2014-09-28T02:13:15.587 に答える