2009-07-16 59 views
1

我讀的文件IRepository.cs亞音速3. 的源代碼,我發現以下幾點:加載方法被定義爲通用的IRepository接口

public interface IRepository<T> 
{ 
    IQueryable<T> GetAll(); 
    PagedList<T> GetPaged<TKey>(Func<T, TKey> orderBy, int pageIndex, int pageSize); 
    ...many other lines 
    bool Load<T>(T item, Expression<Func<T, bool>> expression) where T : class, new(); 
    bool Load<T>(T item, string column, object value) where T : class, new(); 
} 

通知及其泛型類型名稱是與導致編譯器警告的接口的通用類型相同。

我的問題是:加載方法真的是通用的或它是一個錯誤?如果這些方法的目的是通用的,我們是否應該將類型名稱從「T」改爲類似「E」的類型以使編譯器感到滿意?

回答

1

他們不應該是不同的 - 負載應該對回購「式」工作,所以你可以刪除有定義的(我認爲這是你在做什麼)

+0

那麼爲什麼這些聲明會添加自己的約束? – 2009-07-16 07:33:49

+0

好的,我相應地修改了代碼,它導致編譯器錯誤,我不得不修改其他幾個使項目編譯的文件將很快提交更改,以便檢查我是否做得正確。 – 2009-07-16 07:36:51

0

他們有限制,不同於班級T,所以我猜他們應該是不同的。

+0

感謝您的提示。這帶來了另一個問題: 如果我將簽名更改爲 bool Load (...)其中E:class,new(); 那麼參數是什麼?它們將是 布爾負載(E項,式(Func鍵>表達)或 布爾負載(T項,表達式(Func鍵>表達)或 既不上述 – 2009-07-16 07:32:24

+0

@Wei馬 - ?抱歉,可以」這只是一個基於你發佈的代碼的推論 – 2009-07-16 07:34:22

0

在我看來像classnew約束應該在類級別 - 而不是方法級別。

否則,是的 - 你剛纔定義的2個不同的T限制這只是混亂的地獄,因爲我可以這樣做:

IRepository<int> intRepository = new RepositoryImpl<int>(); 

object o; 
intRepository.Load<string>(o, "column", "value"); 

有一個IRepository<int>Load<string>似乎很奇怪,我。

這是可能是T必須只爲Load方法classnew,而不是其他。在這種情況下,你可能想是這樣的:

interface IRepository<T> { 
    IQueryable<T> GetAll(); 
    bool Load<TClass>(TClass item, string column, object value) where TClass : class, T, new(); 
} 

這是不準確一樣,因爲TClass可以只繼承T - 但我能想到的產生結果最接近的約束。