2009-06-10 68 views
3

我有一个具有多个属性的对象。创建一个将lambda表达式传递给构造函数的对象

我希望能够在我调用构造函数时分配这些属性的一些。

显而易见的解决方案是要么有一个构造函数,为每个属性提供一个参数,但是当有很多时,这是很讨厌的。另一种解决方案是创建每个都需要属性值的子集的重载,但最终会导致数十个重载。

所以我想,那岂不是很好,如果我可以说..

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。那很快。 如果我要求更多详细信息,你会被冒犯吗?正如我所说,我很昏暗。 – 2009-06-10 12:16:12

+0

当我第一次注意到你的回复时没有看到你的例子。 – 2009-06-10 12:17:10

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

我可能具备的功能的通用样式错的,但我认为这是某种你描述的。

1

基本上什么安德鲁想说的是,如果你有一个类(为MyObject为EG)与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

谢谢马特。即使在最初的帖子之后的这段时间,我还没有意识到这一点。 – 2012-03-26 19:12:01

相关问题