如何返回继承通用列表的类?
我有这个类:如何返回继承通用列表的类?
public class CampaignMaps : List<CampaignMap> { };
的CampaignMap对象是我自己的,并没有继承任何东西。它有你的标准属性和方法。
然后我有一个CampaignMapAdapter对象,它充当我的ObjectDatasource的数据。它有一个数据一个私有财产:
[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;
抛出错误:
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'CampaignMaps'. An explicit conversion exists (are you missing a cast?)
我用简单的英语假设我要_data总是包含ALL我的数据元素,然后调用特别是select
应该根据需要减少它们。我如何去做这件事?
在此先感谢。
你为什么要做_data = selectQuery;
?
我想你在GetFiltered方法意图会是这样的:为什么您使用的是CampaignMaps
类
return new CampaignMaps(selectQuery);
然而,像亚当说,我会认真考虑。
如果你想的公共接口只允许通过过滤“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)
。
我想我的结构有点复杂。我接受了你和大家的建议,并且一起取消了所有CampaignMaps类,并将所有内容列表清单
嗯,你可以这样做:
CampaignMaps maps = new CampaignMaps();
maps.AddRange(selectQuery);
_data = maps;
这将让你在正确的类型正确的数据。
但是,我会强烈考虑而不是从List<T>
开始 - 它几乎从来不是一个好主意;除非你真的专注于这种行为,否则更喜欢构成而不是继承。
我也会说,在GetFiltered
方法中突变当前对象违反了最少突击的原则。我会要么改变它,使它更清楚,它是一个突变(例如“FilterByErrors”),并给它一个无效返回类型,或只是让它返回过滤列表而不会突变当前对象。
你在'CampaignMaps'中做了一些特定的事情吗?使用它而不是仅仅列出'List'将会使这变得更加困难。 –
你为什么需要这样的班级?你为什么不能返回一个'List'对象,或者用'List '字段创建一个类。 –