2014-09-28 14 views
1

나는 자신의 ID에 따라 클래스 TUser의 객체를 삭제하는 프로 시저를 UserController 클래스에 가지고 있습니다. GenericController 클래스를 다른 클래스와 함께 할 수 있도록 만들고 싶습니다.Delphi :이 절차에서 매개 변수로 객체와 클래스를 전달하는 방법 (TMS Aurelius)?

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 아우렐리우스에서 찾기 :

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

답변

2

일반 사항은 컴파일시 해결됩니다. b ut 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; 

, TUserControllerTGenericController에서 파생 된 경우, 다음 DeleteUser()이 할 수있는 :

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

다른 방법을 권장합니다. –

+1

메서드 TGenericController.Delete에 generics를 사용하십시오. (IdValue : Variant); var LInst : E; ... LInst : = FManager.Find (IdValue); ... ' –

+0

@SirRufo 나는 그 결과를 시험해보고 고맙겠습니다. –