0

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

首先,我们将调用 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 拒绝识别 List 对象定义中的 SessionObjectDataItem 属性 IsDirty。

我试图结束的是一个我可以定义的情况

public class AssociatedDocument : SessionObjectDataItem
{
    ...
}

public class DocumentList : SessionObjectDataList
{

}

然后就可以说...

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

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

4

2 回答 2

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)
{
    ...
}
于 2010-10-17T13:47:21.263 回答
1

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

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

ElseWhere简单地将 d 假定为 Object 类型。

于 2010-10-17T13:45:51.483 回答