new MyType() { Parameter1 = current-6ren">
gpt4 book ai didi

c# - 对象初始化和 "Named Constructor Idiom"

转载 作者:太空宇宙 更新时间:2023-11-03 20:46:37 24 4
gpt4 key购买 nike

好的。所以我有一个值列表,我想执行如下操作:

MyObjectValues
.Select(currentItems=>new MyType()
{
Parameter1 = currentItems.Value1,
Parameter2 = currentItems.Value2
});

所以问题来了。我需要上面的示例来使用命名构造函数,例如:

MyObjectValues
.Select(currentItems=>MyType.GetNewInstance()
{
Parameter1 = currentItems.Value1,
Parameter2 = currentItems.Value2
});

有什么办法可以做到吗?基本上,我有一个需要调用的静态方法来取回对象实例,我想像上面那样初始化它。

编辑:我目前没有修改 MyType 接口(interface)的简单方法,因此添加新函数调用(虽然可能是“最佳”方法)目前不是很实用。

最佳答案

不幸的是,在 C# 3.0 中没有对此的直接支持。构造函数调用支持对象初始值设定项。但是,您可能会考虑 Builder 模式。在我的 Protocol Buffers 端口中,我是这样支持它的:

MyType foo = new MyType.Builder {Parameter1 = 10, Parameter2 = 20}.Build();

所以你的例子会变成:

MyObjectValues.Select(currentItems => new MyType.Builder
{
Parameter1 = currentItems.Value1,
Parameter2 = currentItems.Value2
}.Build());

当然,这意味着编写嵌套的Builder 类型,但它可以很好地工作。如果您不介意 MyType 严格来说是可变的,您可以保留一个不可变的 API,但创建一个 Builder 的实例。立即创建 MyType 的新实例,然后设置属性(因为它可以访问私有(private)成员),最后返回 MyType 的实例在Build()方法。 (然后它应该“忘记”这个实例,这样进一步的突变就被禁止了。)

关于c# - 对象初始化和 "Named Constructor Idiom",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/620484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com