Инициализатор объектов и Динамически определяющие свойства

С инициализатором объекта возможно ли дополнительно включить настройку свойства?

Например:

Request request = new Request
{
    Property1 = something1,
    if(something)
        Property2 = someting2,                                      
    Property3 = something3
};

3 ответа

Решение

Не то, чтобы я знал. Уверен, ваш единственный вариант - сделать это так:

Request request = new Request
{
    Property1 = something1,
    Property3 = something3
};
if(something)
    request.Property2 = someting2;

Или вы можете сделать это так, если есть значение по умолчанию /null, которое вы можете установить:

Request request = new Request
{
    Property1 = something1,
    Property2 = something ? someting2 : null,
    Property3 = something3
};   

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

Очевидно, что вы можете делать хаки для достижения чего-то похожего, например, установить для свойства то, что вы знаете как значение по умолчанию (например, new Request { Property2 = (something ? something2 : null) }), но установщик все равно будет вызываться - и, конечно, это будет иметь непредвиденные последствия, если разработчик Request решит изменить значение свойства по умолчанию. Поэтому лучше всего избегать такого рода уловок и выполнять любую условную инициализацию, написав явные операторы set старым способом pre-object-initializer.

Нет, поскольку это статические вызовы, они не могут быть удалены или добавлены во время выполнения в зависимости от некоторых условий.

Вы можете изменить значение условно, например так:

Foo foo = new Foo { One = "", Two = (true ? "" : "bar"), Three = "" };
Другие вопросы по тегам