如何返回继承泛型列表的类?

本文关键字:列表 泛型 继承 何返回 返回 | 更新日期: 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)