我有一个具有许多属性的对象。
我想在调用构造函数时能够分配一些这些属性。
显而易见的解决方案是要么有一个构造函数,它为每个属性提供一个参数,但是当有很多属性时这是很讨厌的。另一个解决方案是创建重载,每个重载都取一个属性值的子集,但最终我可能会遇到几十个重载。
所以我想,如果我能说,那就不好了。
MyObject x = new MyObject(o => o.Property1 = "ABC", o.PropertyN = xx, ...);
问题是,我太蠢了,无法解决如何这样做。
你知道吗?答案 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);
}
}
}
我可能有函数泛型样式错误,但我认为这是你所描述的。