Создание базового класса на основе List <T> - PullRequest
0 голосов
/ 17 октября 2010

Мне нужно создать пару классов, которые будут служить базовыми классами для некоторых функций данных, которые я хочу реализовать.

Во-первых, мы будем называть 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, и вот где я застрял.

Я могу создать класс ОК ...

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

}

, где я падаю, пытается определить свойства в списке, которые обращаются к элементам в нем. Например, я хочу написать ...

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

но VS отказывается распознавать свойство IsDirty SessionObjectDataItem внутри определения объекта List.

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

public class AssociatedDocument : SessionObjectDataItem
{
    ...
}

public class DocumentList : SessionObjectDataList
{

}

А потом сможете сказать ...

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

Могу ли я на самом деле сделать то, что я пытаюсь? Я просто делаю это неправильно?

Ответы [ 2 ]

2 голосов
/ 17 октября 2010

Общие ограничения помогут здесь;Вы можете написать контейнер-класс, для которого общий параметр типа ограничен 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)
{
    ...
}
1 голос
/ 17 октября 2010

Попробуйте использовать универсальную версию Where<T> интерфейса с запросом:

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

Иначе Where просто принимает d в качестве типа Object.

...