我需要创建一些类,这些类将作为我想要实现的某些数据功能的基类。
首先,我们将调用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)
{
...
}
我真的可以做我正在尝试的事吗?我只是做错了吗?
答案 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类型。