Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象初始化和";命名构造函数成语;_C#_.net_Object Initializers - Fatal编程技术网

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的实现