支持嵌套对象的生成器

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# 中委托类型(如 ActionFuncPredicate,或者直接 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