2010-09-02 31 views
1

我有一堆存儲庫類,它們都看起來有點像下面。請注意,我省略了某些方法;我只是想讓你有味道。C#:如何創建一個通用的超類,以擴展非泛型子類

public class SuggestionRepository : ISuggestionRepository 
{ 
    private IUnitOfWork _unitOfWork; 

    public SuggestionRepository(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 

    public Suggestion Load(int id) 
    { 
     Suggestion suggestion; 
     suggestion = _unitOfWork.Load<Suggestion>(id); 
     return suggestion; 
    } 

    public IQueryable<Suggestion> All 
    { 
     get { return _unitOfWork.GetList<Suggestion>(); } 
    } 
}

您可以想象我的存儲庫之間重複的代碼數量。

我想創建一個存儲庫<T>類,它由我的存儲庫擴展,所以希望我不必爲每個存儲庫編寫樣板代碼。這個類可能看起來像以下:

internal class Repository<T> where T : Entity 
{ 
    private IUnitOfWork _unitOfWork; 

    internal Repository<T>(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 

    public T Load(int id) 
    { 
     T t; 
     t = _unitOfWork.Load<T>(id); 
     return t; 
    } 

    public IQueryable<T> All 
    { 
     get { return _unitOfWork.GetList<T>(); } 
    } 
} 

但Visual Studio未顯示出任何的構造在所有的愛。它會在參數列表括號內說'意外標記',表示它不能在靜態上下文中訪問非靜態字段_unitOfWork,並假裝它不知道參數unitOfWork是什麼。

明顯泛型的類可以有構造函數,因爲它可能新增列表<T>例如。發生什麼了?

+0

獲取要顯示的尖括號,他們需要(格式化爲代碼,即對自己工作的事實暗示行縮進四個空格,或用引號括起來)。 'code'按鈕(101010)將對您在編輯器中選擇的任何文本執行正確的操作。 – AakashM 2010-09-02 10:48:38

+0

@Paul Ruane通過刪除不正確的語法與您的編輯,你已經使人們很難找出問題是什麼... – AakashM 2010-09-02 10:52:02

+0

謝謝保羅,我感謝您的編輯。我可以使用這篇文章作爲獲取格式正確的參考。 – David 2010-09-02 10:58:31

回答

1

泛型類的構造函數不應該在方法名中包含類型參數。簡單地說,

internal Repository(IUnitOfWork unitOfWork) 

看看你是怎麼回事。

+0

這就是獾。 – David 2010-09-02 11:15:16

0

你不能在構造函數中指定<T>,它是由該類上泛型類型T