Инициализаторы объектов C # и коллекции - PullRequest
2 голосов
/ 26 июля 2010

Я пытаюсь настроить класс так, чтобы его можно было инициализировать с помощью инициализатора объекта, но он содержит некоторые коллекции.В идеале я хотел бы, чтобы клиентский код мог выполнять:

MyClass myObj = new MyClass
{
  Name = "Name",
  Contents = new[]
  {
    "Item1",
    "Item2"
  }
}

Однако, где Contents должно быть BindingList<string>.В базовом поле хранится ссылка только для чтения на этот список, и я бы хотел, чтобы установщик по существу сделал Clear, а затем AddRange для установки содержимого.

Я не могу сделать ContentsСвойство IEnumerable<string>, потому что клиентский код не будет видеть метод Add, среди многих других, по крайней мере, без его приведения.Я не могу сделать это BindingList<string>, потому что, если я его установлю, мне нужно создать новый список привязок для передачи ему ... это может быть возможно, но я бы не стал вводить неэффективность создания нового BindingList<string>исключительно для того, чтобы передать его установщику свойств.

Идеальная вещь, которую можно сделать, - это получить геттер, возвращающий BindingList<string>, и установщик принимает IEnumerable<string>, но C # не делаетразрешить геттерам / сеттерам свойства иметь разные типы.

О, и неявное приведение между BindingList<string> и IEnumerable<string> - нет-нет, поэтому я тоже не могу этого сделать (http://blogs.msdn.com/b/peterhal/archive/2005/06/20/430929.aspx).

Есть ли способ обойти это?

Ответы [ 3 ]

2 голосов
/ 26 июля 2010
Синтаксис инициализатора

C # автоматически вызовет метод Add объекта коллекции вашего свойства.Это, конечно, не вызовет Reset() заранее, но объект все еще пуст в этот момент, поэтому это не имеет значения.

Должен ли при замене списка использоваться набор свойств синтаксиса?Использование сеттера для замены содержимого коллекции без фактического изменения идентификатора объекта коллекции очень неожиданно и может привести к ошибкам.

1 голос
/ 26 июля 2010

Создайте пользовательский класс коллекции, производный от BindingList<string>, и добавьте неявное приведение типа string[]

0 голосов
/ 26 июля 2010

Я бы рекомендовал инкапсулировать BindingList. В этой ситуации вернитесь к старому способу создания объектов, чтобы не создавать ненужных связей. Подарите добро на языковые соглашения.

...