2009-06-10 3 views
3

У меня есть объект с рядом свойств.Создание объекта, передающего лямбда-выражение для конструктора

Я хочу иметь возможность назначить некоторые из этих свойств при вызове конструктора.

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

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

MyObject x = new MyObject(o => o.Property1 = "ABC", o.PropertyN = xx, ...);

Проблема заключается в том, что я слишком тусклыми, чтобы работать как сделать это.

Знаете ли вы?

ответ

8

C# 3 позволяет сделать это с помощью своего инициализатора .

Вот пример:

using System; 

class Program 
{ 
    static void Main() 
    { 
     Foo foo = new Foo { Bar = "bar" }; 
    } 
} 

class Foo 
{ 
    public String Bar { get; set; } 
} 

Как это работает в том, что компилятор создает экземпляр класса с именем сгенерированного компилятором (как <>g__initLocal0). Затем компилятор берет каждое свойство, которое вы инициализируете, и устанавливает значение свойства.

В основном компилятор переводит метод Main выше что-то вроде этого:

static void Main() 
{ 
    // Create an instance of "Foo". 
    Foo <>g__initLocal0 = new Foo(); 
    // Set the property. 
    <>g__initLocal0.Bar = "bar"; 
    // Now create my "Foo" instance and set it 
    // equal to the compiler's instance which 
    // has the property set. 
    Foo foo = <>g__initLocal0; 
} 
+0

Crikey. Это было быстро. Не могли бы вы обидеть, если бы я попросил немного более подробно? Как я уже сказал, я довольно тусклый. –

+0

Не видел ваш пример, когда я впервые заметил ваш ответ. –

0
class MyObject 
{ 
    public MyObject(params Action<MyObject>[]inputs) 
    { 
      foreach(Action<MyObject> input in inputs) 
      { 
       input(this); 
      } 
    } 
} 

I может иметь функцию общий стиль неправильно, но я думаю, что это какая-то, что вы описываете.

1

В основном то, что Эндрю пытается сказать, если у вас есть класс (MyObject для например) с N свойствами, с помощью инициализатора объекта синтаксиса C# 3.0, вы можете установить любое подмножество свойств N, как так:

MyObject x = new MyObject {Property1 = 5, Property4 = "test", PropertyN = 6.7};

Вы можете установить любой из свойств/полей, way./

3

Синтаксис объекта инициализатор является самым простым в использовании и не требует никакого дополнительного кода для конструктора.

Однако, если вам нужно сделать что-то более сложное, например методы вызова, у вас может быть конструктор, который принимает параметр Action для выполнения совокупности объекта.

public class MyClass 
{ 
    public MyClass(Action<MyClass> populator) 
    { 
     populator.Invoke(this); 
    } 

    public int MyInt { get; set; } 
    public void DoSomething() 
    { 
     Console.WriteLine(this.MyInt); 
    } 
} 

Теперь вы можете использовать его так.

var x = new MyClass(mc => { mc.MyInt = 1; mc.DoSomething(); }); 
+0

Thanks Matt. Даже в это время после первого поста я этого не узнал. –