如何返回继承泛型列表的类?
本文关键字:列表 泛型 继承 何返回 返回 | 更新日期: 2023-09-27 18:10:03
我有这样一个类:
public class CampaignMaps : List<CampaignMap> { };
CampaignMap对象是我自己的,不继承任何东西。它有你的标准属性和方法。
然后我有一个作为ObjectDatasource数据的CampaignMapAdapter对象。它对数据有一个私有属性:
[DataObject(true)]
public class CampaignMapAdapter
{
private Database db = new Database(
ConfigurationManager.AppSettings["AppName"],
ConfigurationManager.AppSettings["DBService"],
ConfigurationManager.AppSettings["DBUser"]);
private CampaignMaps _data
{
get
{
CampaignMaps maps = new CampaignMaps();
CampaignsAdapter adapter = new CampaignsAdapter();
db.Init();
db.AddParameter(null, null, ParameterDirection.ReturnValue, OracleType.Cursor);
DataSet ds = db.ExecuteDataSet(PROC_GET_CAMPAIGN_MAPS);
DataTable dt = ds.Tables[0];
foreach (DataRow row in dt.Rows)
{
CampaignMap campaignMap = new CampaignMap();
//populate the campaignMap object...
maps.Add(campaignMap);
}
return maps;
}
set
{
_data = value;
}
}
[DataObjectMethod(DataObjectMethodType.Select, true)]
public CampaignMaps GetFiltered(bool hasErrors)
{
var selectQuery = from c in _data where c.HasError == hasErrors select c;
_data = selectQuery;
}
}
_data = selectQuery;
抛出错误:
不能隐式转换类型"System.Collections.Generic。IEnumerable"CampaignMaps"。存在显式转换(您是否缺少演员?)
我想在简单的英语中,我希望_data总是包含所有我的数据元素,然后调用特定的select
应该根据需要减少它们。我该怎么做呢?
你可以这样做:
CampaignMaps maps = new CampaignMaps();
maps.AddRange(selectQuery);
_data = maps;
这将为您提供正确类型的正确数据。
然而,我强烈认为不是从List<T>
开始-这几乎从来都不是一个好主意;选择组合而不是继承,除非你真的要对行为进行专门化。
我还会说,在称为GetFiltered
的方法中改变当前对象违反了最小意外原则。我会或者更改它以使它更清楚地表明它是一个突变(例如;"FilterByErrors")并给它一个void返回类型,或只是让它返回过滤列表而不改变当前对象。
你为什么要做_data = selectQuery;
?
我认为你在GetFiltered方法中的意图应该是这样的:
return new CampaignMaps(selectQuery);
然而,就像Adam说的,我会认真考虑你为什么要使用CampaignMaps
类。
如果你想让公共接口只允许通过"HasErrors"进行过滤,让GetFiltered方法看起来像这样:
public IEnumerable<CampaignMap> GetFiltered(bool hasErrors)
{
return _data.Where(c => c.HasError == hasErrors);
}
我看不出你为什么想要这个GetFiltered方法。为什么不将_data属性暴露为仅获取的IEnumerable<CampaignMap>
,然后允许其他对象直接在其上运行Linq查询?这样的:
public IEnumerable<CampaignMap> Data
{
get { return _data; }
}
然后在其他地方写上Data.Where(c => c.HasError == whatever)