2010-10-17 1 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 отказывается признать свойство IsDirty SessionObjectDataItem внутри определения объекта списка.

То, что я пытаюсь закончить с случай, когда я мог бы определить

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(); 
    } 
} 

Else Where просто предполагает д как тип объекта.

+0

FGE. Каждый день - школьный день. Я часто видел, что перегрузка появилась в intellisense, но на самом деле не понимала ее значимости. Теперь я знаю. –

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

Кровавый чудесный! Это решает все проблемы. Спасибо Ани. –

Смежные вопросы