2014-09-28 45 views
1

我在我的類UserController中有一個過程,根據它的ID刪除類TUser的對象。我想要使​​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

你推薦另一種方法來做到這一點? – 2014-09-28 02:47:41

+1

也可以使用方法'procedure TGenericController.Delete (IdValue:Variant); var LInst:E; ... LInst:= FManager.Find (IdValue); ...' – 2014-09-28 06:31:39

+0

@SirRufo我會盡力回覆結果,謝謝。 – 2014-09-28 19:46:49

相關問題