创建一个将lambda表达式传递给构造函数的对象

时间:2009-06-10 12:13:22

标签: c#-3.0 object lambda

我有一个具有许多属性的对象。

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

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

所以我想,如果我能说,那就不好了。

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

问题是,我太蠢了,无法解决如何这样做。

你知道吗?

4 个答案:

答案 0 :(得分:8)

C#3允许您使用 object initializer 语法执行此操作。

以下是一个例子:

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;
}

答案 1 :(得分:4)

对象初始化程序语法是最容易使用的,并且不需要构造函数的额外代码。

但是,如果你需要做一些更复杂的事情,比如调用方法,你可以有一个构造函数,它接受一个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(); });

答案 2 :(得分:1)

基本上安德鲁试图说的是,如果你有一个具有N个属性的类(例如MyObject),使用C#3.0的Object Initializer语法,你可以设置N个属性的任何子集:

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

您可以设置任何属性/字段./

答案 3 :(得分:0)

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

我可能有函数泛型样式错误,但我认为这是你所描述的。