2010-07-25 3 views
2

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

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

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

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

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

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

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

ответ

2

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

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

1

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

0

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

Смежные вопросы