2010-10-17 52 views
0

我需要創建幾個類,它們將充當我想要實現的某些數據功能的基類。創建基於列表的基類<T>

首先,我們會打電話給SessionObjectDataItem看起來像這樣...

public class ObjectSessionDataItem 
{ 
    public int ID { get; set; } 

    public bool IsDirty { get; set; } 

    public bool IsNew { get; set; } 

    public bool IsRemoved { get; set; } 
} 

而接下來我想叫ObjectSessionDataList名單,這是我卡住。

我可以創建類OK ...

public class SessionObjectDataList<SessionObjectDataItem> : List<SessionObjectDataItem> 
{ 

} 

在哪裏跌倒正試圖定義訪問它的項目名單上的屬性。例如,我想寫...

public List<SessionObjectDataItem> DirtyItems 
{ 
    get 
    { 
     return this.Where(d => d.IsDirty).ToList(); 
    } 
} 

但是VS拒絕識別List對象定義中的SessionObjectDataItem屬性IsDirty。

我試圖用落得就是我可能會

public class AssociatedDocument : SessionObjectDataItem 
{ 
    ... 
} 

public class DocumentList : SessionObjectDataList 
{ 

} 

,然後才能說的情況下...

DocumentList list = new DocumentList(); 
... 
foreach(AssociatedDocument doc in list.DirtyItems) 
{ 
    ... 
} 

我能真正做到這一點是什麼我正在嘗試?我只是做錯了嗎?

回答

1

儘量使用可查詢接口的通用Where<T>版本:

public List<SessionObjectDataItem> DirtyItems 
{ 
    get 
    { 
     return this.AsQueryAble().Where<SessionObjectDataItem>(d => d.IsDirty).ToList(); 
    } 
} 

否則Where簡單地假設d爲Object類型。

+0

FGE。每一天都是學校的一天。我經常看到,intellisense中出現超載,但並沒有真正理解它的重要性。現在我明白了。 – 2010-10-17 14:17:19

2

通用約束將在這裏幫助;您可以編寫一個容器類,其中泛型類型參數被約束爲SessionObjectDataItem或其某個子類型。這將允許你爲構造一個泛型類,它可以容納特定子類型的實例SessionObjectDataItem

public class SessionObjectDataList<T> : List<T> where T : SessionObjectDataItem 
{ 
    public SessionObjectDataList<T> DirtyItems 
    { 
     get 
     { 
      return this.Where(d => d.IsDirty).ToList(); 
     } 
    } 
} 

用法:

var list = new SessionObjectDataList<AssociatedDocument>(); 
... 

foreach(AssociatedDocument doc in list.DirtyItems) 
{ 
    ... 
} 
+0

血腥奇妙!這解決了所有問題。謝謝Ani。 – 2010-10-17 14:16:15