支持嵌套对象的生成器
Builder with support for nested objects
我是 C# 和一般编程的新手,当我发现以下问题时,正试图找出如何实现可以支持嵌套对象的构建器:
接受的解决方案有效,但我意识到我不完全理解代码中发生的事情。
尤其是定义动作的这一部分:
public ReceiptBuilder WithItem(string text, Action<ReceiptItemBuilder> itemBuilder)
{
var rib = new ReceiptItemBuilder(text);
itemBuilder(rib);
r.AddItem(rib.Build());
return this;
}
如果有人能解释一下这次通话中发生了什么,那就太好了?
itemBuilder(rib);
Action 是一种委托类型,在 C# 中委托类型(如 Action
、Func
和 Predicate
,或者直接 delegate
)是传递的方式周围的方法作为参数。可以通过 itemBuilder(rib)
直接调用委托类型,这会执行带有参数 rib
.
的操作(方法)itemBuilder
它的作用是这样的:
首先我们用 Action 参数声明方法
public ReceiptBuilder WithItem(string text, Action<ReceiptItemBuilder> itemBuilder)
Action<ReceiptItemBuilder>
将我们的参数限制为 return 一个 void
的方法,并采用一个 ReceiptItemBuilder
.
类型的参数
所以我们现在可以声明一个符合这些标准的方法。这是我的:
public void ItemWithIngredient(ReceiptItemBuilder itemBuilder)
{
itemBuilder.WithIngredients("Ingredients1");
}
然后像这样传递给 WithItem
:
WithItem("Item1", ItemWithIngredient);
现在这没什么用,因为我们无法更改成分,因为我们对其进行了硬编码。所以我们改为使用一种叫做匿名方法的东西,我们用这样的 lambda 表达式定义它:
WithItem("Item1", i => i.WithIngredients("Ingredients1"));
i => ...
部分基本上是声明一个方法并使用它。 i
这里是参数,类型是ReceiptItemBuilder
.
这个答案有点乱,我不善于解释。我强烈建议您查看 Olivier Rogier 在评论中发布的链接,但这里是对三种标准委托类型的快速概述:
Action:Action
是一种方法,return 是一个 void 且不带参数的方法。它有一些像 Action<T>
这样的重载,它代表一个带有一个 T
类型参数的方法(用你想要的任何类型替换 T
)。更多的参数有更多的重载(Action<T1, T2>
, Action<T1, T2, T3>
...)
Func: Func<T>
是一种 returns T
并且不带参数的方法(没有 Func
因为 Func 总是 returns 东西).这也有重载,这些采用参数 (Func<TInput, TOutput>
, Func<TInput1, TInput2, TOutput>
...)
谓词:Predicate<T>
总是接受一个参数,return 是 bool
我是 C# 和一般编程的新手,当我发现以下问题时,正试图找出如何实现可以支持嵌套对象的构建器:
接受的解决方案有效,但我意识到我不完全理解代码中发生的事情。
尤其是定义动作的这一部分:
public ReceiptBuilder WithItem(string text, Action<ReceiptItemBuilder> itemBuilder)
{
var rib = new ReceiptItemBuilder(text);
itemBuilder(rib);
r.AddItem(rib.Build());
return this;
}
如果有人能解释一下这次通话中发生了什么,那就太好了?
itemBuilder(rib);
Action 是一种委托类型,在 C# 中委托类型(如 Action
、Func
和 Predicate
,或者直接 delegate
)是传递的方式周围的方法作为参数。可以通过 itemBuilder(rib)
直接调用委托类型,这会执行带有参数 rib
.
itemBuilder
它的作用是这样的:
首先我们用 Action 参数声明方法
public ReceiptBuilder WithItem(string text, Action<ReceiptItemBuilder> itemBuilder)
Action<ReceiptItemBuilder>
将我们的参数限制为 return 一个 void
的方法,并采用一个 ReceiptItemBuilder
.
所以我们现在可以声明一个符合这些标准的方法。这是我的:
public void ItemWithIngredient(ReceiptItemBuilder itemBuilder)
{
itemBuilder.WithIngredients("Ingredients1");
}
然后像这样传递给 WithItem
:
WithItem("Item1", ItemWithIngredient);
现在这没什么用,因为我们无法更改成分,因为我们对其进行了硬编码。所以我们改为使用一种叫做匿名方法的东西,我们用这样的 lambda 表达式定义它:
WithItem("Item1", i => i.WithIngredients("Ingredients1"));
i => ...
部分基本上是声明一个方法并使用它。 i
这里是参数,类型是ReceiptItemBuilder
.
这个答案有点乱,我不善于解释。我强烈建议您查看 Olivier Rogier 在评论中发布的链接,但这里是对三种标准委托类型的快速概述:
Action:Action
是一种方法,return 是一个 void 且不带参数的方法。它有一些像 Action<T>
这样的重载,它代表一个带有一个 T
类型参数的方法(用你想要的任何类型替换 T
)。更多的参数有更多的重载(Action<T1, T2>
, Action<T1, T2, T3>
...)
Func: Func<T>
是一种 returns T
并且不带参数的方法(没有 Func
因为 Func 总是 returns 东西).这也有重载,这些采用参数 (Func<TInput, TOutput>
, Func<TInput1, TInput2, TOutput>
...)
谓词:Predicate<T>
总是接受一个参数,return 是 bool