C# 3.0 创建将lambda表达式传递给构造函数的对象

C# 3.0 创建将lambda表达式传递给构造函数的对象,c#-3.0,object,lambda,C# 3.0,Object,Lambda,我有一个具有许多属性的对象 我希望在调用构造函数时能够分配其中一些属性 显而易见的解决方案是要么使用一个构造函数为每个属性获取一个参数,但如果有很多属性,这就很糟糕了。另一个解决方案是创建重载,每个重载都包含属性值的子集,但最终可能会产生几十个重载 所以我想,如果我能说 MyObject x=新的MyObject(o=>o.Property1=“ABC”,o.PropertyN=xx,…); 问题是,我太笨了,不知道怎么做 你知道吗?C#3允许你用它的对象初始值设定语法来实现这一点 以下是一

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

我希望在调用构造函数时能够分配其中一些属性

显而易见的解决方案是要么使用一个构造函数为每个属性获取一个参数,但如果有很多属性,这就很糟糕了。另一个解决方案是创建重载,每个重载都包含属性值的子集,但最终可能会产生几十个重载

所以我想,如果我能说


MyObject x=新的MyObject(o=>o.Property1=“ABC”,o.PropertyN=xx,…);

问题是,我太笨了,不知道怎么做

你知道吗?

C#3允许你用它的对象初始值设定语法来实现这一点

以下是一个例子:

using System;

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

class Foo
{
    public String Bar { get; set; }
}
其工作方式是编译器使用编译器生成的名称创建类的实例(如
g_uuinitlocal0
)。然后编译器接受您初始化的每个属性并设置该属性的值

基本上,编译器将上面的
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;
}
static void Main()
{
//创建“Foo”的实例。
Foo g_uuinitlocal0=new Foo();
//设置属性。
g_uuinitlocal0.Bar=“Bar”;
//现在创建我的“Foo”实例并设置它
//等于编译器的实例,该实例
//已设置属性。
Foo Foo=g_uuinitlocal0;
}
类MyObject
{
公共MyObject(参数操作[]输入)
{
foreach(输入中的操作输入)
{
输入(本);
}
}
}

我可能把函数的泛型风格弄错了,但我认为这就是你所描述的。

基本上Andrew想说的是,如果你有一个类(MyObject for eg)有N个属性,使用C#3.0的对象初始值设定语法,你可以设置N个属性的任何子集,如下所示:

MyObject x=新的MyObject{Property1=5,Property4=“test”,PropertyN=6.7}


您可以这样设置任何属性/字段。/

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

但是,如果需要执行更复杂的操作,如调用方法,则可以使用一个构造函数,该构造函数使用Action参数来执行对象的填充

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

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

哎呀。那很快。如果我问你更多的细节,你会生气吗?正如我所说,我很傻。当我第一次注意到你的回答时,我没有看到你的例子。谢谢马特。即使在第一篇文章发表后这么长时间,我还没有意识到这一点。
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(); });