C # 3.0, инициализатор объекта и получить свойство, возвращающее массив, как инициализировать? - PullRequest
1 голос
/ 13 мая 2009

Имея следующий класс:

public class SomeClass
{
    private readonly int[] _someThings;

    public SomeClass()
    {
        _someThings = new int[4];
    }

    public int[] SomeThings
    {
        get { return _someThings; }
    }
}

Как использовать синтаксис инициализатора объекта для инициализации свойства SomeThings , как в следующем (нерабочем) извлечении кода?

var anObject = new SomeClass
    {
        SomeThings[0] = 4,
        SomeThings[3] = 8
    }

Обновление

Можно сделать (даже без свойства set ):

anObject.SomeThings[0] = 4;
anObject.SomeThings[3] = 8;

Но я пытаюсь использовать синтаксис инициализатора объекта.

Ответы [ 4 ]

3 голосов
/ 13 мая 2009

AFAIK, вы можете использовать только такой метод Add:

public class SomeClass
{
  void Add(int index, int item) 
  { 
    // ...
  }
}

var anObject = new SomeClass()
    {
        {0, 4}, // Calls Add(0, 4)
        {4, 8}  // Calls Add(4, 8)
    }
2 голосов
/ 13 мая 2009

Синтаксис Object Initializer - это «синтетический сахар» для установки открытых свойств.

Для SomeThings нет общедоступного установщика, поэтому вы не можете сделать это следующим образом.

Итак, это ...

Foo x = new Foo() { Bar = "cheese" };

... совпадает с ...

Foo x = new Foo();
x.Bar = "cheese;

... и поэтому не имеет возможности проникать в приватные члены, чтобы устанавливать вещи.

0 голосов
/ 13 мая 2009

Вы можете добавить перегруженный конструктор:

public class SomeClass
{
    private readonly int[] _someThings;

    public SomeClass()
    {
        _someThings = new int[4];
    }

    public SomeClass(int[] someThings)
    {
        _someThings = someThings;
    }

    public int[] SomeThings
    {
        get { return _someThings; }
    }
}

...

        var anObject = new SomeClass(new [] {4, 8});
0 голосов
/ 13 мая 2009

Теоретически вы можете сделать это так:

var anObject = new SomeClass {
    InitialSomeThings = new[] {
         1,
         2,
         3,
         4
    }
}

class SomeClass {
    private readonly int[] _somethings;
    public int[] 
       get { return _somethings; }
    }

    public int[] InitialSomeThings {
       set { 
           for(int i=0; i<value.Length; i++)
               _somethings[i] = value[i];
       }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...