Как мне вернуть класс, который наследует общий список? - PullRequest
0 голосов
/ 30 сентября 2011

У меня есть этот класс:

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; выдает ошибку:

Невозможно неявно преобразовать тип 'System.Collections.Generic.IEnumerable' для 'CampaignMaps'. Существует явное преобразование (вы пропустили отливать?)

Полагаю, на простом английском языке я хочу, чтобы _data всегда содержала ALL моих элементов данных, а затем вызов определенного select должен уменьшить их, как хотелось бы. Как мне это сделать?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 30 сентября 2011

Ну, вы могли бы сделать:

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

Это дало бы вам правильные данные в правильных типах.

Однако я бы настоятельно рекомендовал не выводс List<T> для начала - это почти никогда не хорошая идея;предпочитайте композицию наследованию, если вы действительно не специализируете поведение.

Я бы также сказал, что изменение объекта current в методе с именем GetFiltered нарушает принцип наименьшего удивления.Я бы либо изменил бы его, чтобы было яснее, что это мутация (например, "FilterByErrors"), и дал бы ему тип возврата void, или просто заставил бы его возвращать отфильтрованный список без изменениятекущий объект.

2 голосов
/ 30 сентября 2011

Почему вы делаете _data = selectQuery;?

Я думаю, ваше намерение в методе GetFiltered будет выглядеть примерно так:

return new CampaignMaps(selectQuery);

Однако, как сказал Адам, я бы серьезно подумалпочему вы используете класс CampaignMaps.

Если вы хотите, чтобы в общедоступном интерфейсе была разрешена фильтрация только по HasErrors, метод GetFiltered должен выглядеть следующим образом:Не вижу причин, по которым вы хотите использовать этот метод GetFiltered.Почему бы не предоставить свойство _data только для получения IEnumerable<CampaignMap>, а затем разрешить другим объектам напрямую выполнять запросы Linq для него?Вот так:

public IEnumerable<CampaignMap> Data
{
    get { return _data; }
}

Тогда где-то еще я могу просто написать Data.Where(c => c.HasError == whatever).

...