创建基于List <t> </t>的基类

时间:2010-10-17 13:41:56

标签: c# class-design generic-list

我需要创建一些类,这些类将作为我想要实现的某些数据功能的基类。

首先,我们将调用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的List,这就是我被卡住的地方。

我可以创建类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)
{
    ...
}

我真的可以做我正在尝试的事吗?我只是做错了吗?

2 个答案:

答案 0 :(得分: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)
{
    ...
}

答案 1 :(得分:1)

尝试使用可查询接口的通用版Where<T>

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

否则Where只是假定d为Object类型。