如何返回继承通用列表的类?

问题描述:

我有这个类:如何返回继承通用列表的类?

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应该根据需要减少它们。我如何去做这件事?

在此先感谢。

+1

你在'CampaignMaps'中做了一些特定的事情吗?使用它而不是仅仅列出'List '将会使这变得更加困难。 –

+1

你为什么需要这样的班级?你为什么不能返回一个'List '对象,或者用'List '字段创建一个类。 –

你为什么要做_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)

+0

我想我的结构有点复杂。我接受了你和大家的建议,并且一起取消了所有CampaignMaps类,并将所有内容列表清单或IEnumerable ,并且它可以全面工作。 –

嗯,你可以这样做:

CampaignMaps maps = new CampaignMaps(); 
maps.AddRange(selectQuery); 
_data = maps; 

这将让你在正确的类型正确的数据。

但是,我会强烈考虑而不是List<T>开始 - 它几乎从来不是一个好主意;除非你真的专注于这种行为,否则更喜欢构成而不是继承。

我也会说,在GetFiltered方法中突变当前对象违反了最少突击的原则。我会要么改变它,使它更清楚,它是一个突变(例如“FilterByErrors”),并给它一个无效返回类型,只是让它返回过滤列表而不会突变当前对象。