Stu*_*ing 3 lambda object c#-3.0
我有一个具有许多属性的对象.
我想在调用构造函数时能够分配一些这些属性.
显而易见的解决方案是要么有一个构造函数,它为每个属性提供一个参数,但是当有很多属性时这是很讨厌的.另一个解决方案是创建重载,每个重载都取一个属性值的子集,但最终我可能会遇到几十个重载.
所以我想,如果我能说,那不是很好吗
MyObject x = new 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; }
}
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)
对象初始值设定项语法是最容易使用的,并且不需要额外的构造函数代码。
然而,如果你需要做一些更复杂的事情,比如调用方法,你可以有一个构造函数,它接受一个 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)