C# 对象初始化和";命名构造函数成语;
嗯。所以我有一个值列表,我想做如下事情:C# 对象初始化和";命名构造函数成语;,c#,.net,object-initializers,C#,.net,Object Initializers,嗯。所以我有一个值列表,我想做如下事情: MyObjectValues .Select(currentItems=>new MyType() { Parameter1 = currentItems.Value1, Parameter2 = currentItems.Value2 }); 这就是问题所在。我需要上面的示例来处理命名构造函数,例如: MyObjectValues .Select(currentItems=>MyType.GetNewInstance(
MyObjectValues
.Select(currentItems=>new MyType()
{
Parameter1 = currentItems.Value1,
Parameter2 = currentItems.Value2
});
这就是问题所在。我需要上面的示例来处理命名构造函数,例如:
MyObjectValues
.Select(currentItems=>MyType.GetNewInstance()
{
Parameter1 = currentItems.Value1,
Parameter2 = currentItems.Value2
});
我有办法做到吗?基本上,我需要调用一个静态方法来获取对象实例,并且我想如上所述初始化它
编辑:我目前没有一种简单的方法来修改MyType的接口,因此添加新的函数调用(虽然可能是“最好的”方法)目前不是很实用。我相信有人会想出一种聪明的方法来在4.0 C#之前实现它,但我刚刚读了。这应该能解决你的问题。它看起来是这样的:
MyObjectValues.Select(currentItems=>MyType.GetNewInstance(
Parameter1:currentItems.Value1,
Parameter2:currentItems.Value2));
MyType foo = new MyType.Builder {Parameter1 = 10, Parameter2 = 20}.Build();
编辑
忘了提一下,这很有用的是,您可以为参数设置默认值,这样您就不必全部传递它们。这篇博文是一篇很好的简短总结。我相信有人会想出一个聪明的方法在4.0c#之前做到这一点,但我刚刚读了。这应该能解决你的问题。它看起来是这样的:
MyObjectValues.Select(currentItems=>MyType.GetNewInstance(
Parameter1:currentItems.Value1,
Parameter2:currentItems.Value2));
MyType foo = new MyType.Builder {Parameter1 = 10, Parameter2 = 20}.Build();
编辑
忘了提一下,这很有用的是,您可以为参数设置默认值,这样您就不必全部传递它们。这篇博文是一个很好的简短总结。更新:工厂怎么样:
MyObjectValues.Select(currentItems=>MyTypeFactory.GetNewInstance(currentItems.Value1,
currentItems.Value2));
public static class MyTypeFactory
{
public static MyType GetNewInstance(
typeofvalue1 value1,
typeofvalue2 value2)
{
return new MyType { Parameter1 = value1, Parameter2 = value2 };
}
}
更新:工厂如何:
MyObjectValues.Select(currentItems=>MyTypeFactory.GetNewInstance(currentItems.Value1,
currentItems.Value2));
public static class MyTypeFactory
{
public static MyType GetNewInstance(
typeofvalue1 value1,
typeofvalue2 value2)
{
return new MyType { Parameter1 = value1, Parameter2 = value2 };
}
}
不幸的是,在C#3.0中没有对此的直接支持。仅构造函数调用支持对象初始值设定项。但是,您可能会考虑构造器模式。在我的协议缓冲区端口中,我支持如下方式:
MyObjectValues.Select(currentItems=>MyType.GetNewInstance(
Parameter1:currentItems.Value1,
Parameter2:currentItems.Value2));
MyType foo = new MyType.Builder {Parameter1 = 10, Parameter2 = 20}.Build();
所以你的例子是:
MyObjectValues.Select(currentItems => new MyType.Builder
{
Parameter1 = currentItems.Value1,
Parameter2 = currentItems.Value2
}.Build());
当然,这意味着要编写嵌套的构建器类型,但它可以很好地工作。如果您不介意MyType严格地说是可变的,那么您可以保留一个不可变的API,但创建一个
Builder
实例,立即创建一个MyType
的新实例,然后按原样设置属性(因为它可以访问私有成员),最后在Build()中返回MyType
的实例
方法。(然后它应该“忘记”这个实例,以便禁止进一步的突变。)不幸的是,在C#3.0中没有直接的支持。仅构造函数调用支持对象初始值设定项。但是,您可能会考虑构造器模式。在我的协议缓冲区端口中,我支持如下方式:
MyObjectValues.Select(currentItems=>MyType.GetNewInstance(
Parameter1:currentItems.Value1,
Parameter2:currentItems.Value2));
MyType foo = new MyType.Builder {Parameter1 = 10, Parameter2 = 20}.Build();
所以你的例子是:
MyObjectValues.Select(currentItems => new MyType.Builder
{
Parameter1 = currentItems.Value1,
Parameter2 = currentItems.Value2
}.Build());
当然,这意味着要编写嵌套的构建器类型,但它可以很好地工作。如果您不介意MyType严格地说是可变的,那么您可以保留一个不可变的API,但创建一个
Builder
实例,立即创建一个MyType
的新实例,然后按原样设置属性(因为它可以访问私有成员),最后在Build()中返回MyType
的实例
方法。(然后它应该“忘记”该实例,以便禁止进一步的变异。)当它到达时,这看起来很有用。当它到达时,这看起来很有用。我没有一个简单的方法来实际修改这个实例中MyType的实现。有了工厂,你不必修改MyType,仅实现MyTypeFactory在这个实例中,我没有一种简单的方法来实际修改MyType的实现