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

Stu*_*ing 3 lambda object c#-3.0

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

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

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

所以我想,如果我能说,那不是很好吗

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

问题是,我太蠢了,无法弄清楚如何做到这一点.

你知道吗?

And*_*are 8

C#3允许您使用其对象初始化程序语法执行此操作.

这是一个例子:

using System;

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

class Foo
{
    public String Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这种方式的工作方式是编译器使用编译器生成的名称(如<>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;
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 5

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

然而,如果你需要做一些更复杂的事情,比如调用方法,你可以有一个构造函数,它接受一个 Action 参数来执行对象的填充。

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

    public int MyInt { get; set; }
    public void DoSomething() 
    {
        Console.WriteLine(this.MyInt);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以像这样使用它。

var x = new MyClass(mc => { mc.MyInt = 1; mc.DoSomething(); });
Run Code Online (Sandbox Code Playgroud)