【问题标题】:With Method that takes Func<T> on an Object Builder使用在对象生成器上采用 Func<T> 的方法
【发布时间】:2011-03-17 15:18:55
【问题描述】:

我正在尝试创建一个对象生成器,以便我可以轻松地创建用于单元测试的对象。我想创建一个 With() 方法,这样我就可以传入一个 Func,它会为我设置正确的属性。

这是我目前所拥有的:

public class EquipmentModelBuilder
{

    public EquipmentModel Object { get; set; }

    public EquipmentModelBuilder()
    {
        Object = new EquipmentModel();
    }

    public EquipmentModelBuilder WithCategory(int categoryId)
    {
        Object.EquipmentCategoryID = categoryId;
        return this;
    }

    public EquipmentModelBuilder With(Func<EquipmentModel> setter)
    {
        Object = setter.Invoke();
        return this;
    }

    public EquipmentModel Build()
    {
        return Object;
    }
}

当然,WithCategory() 有效,但我不想为每个属性创建所有方法,我希望能够:

EquipmentModelBuilder.With(x => x.Property1 = 1).With(x => x.Property2 = "2").Build()

知道我做错了什么吗?

【问题讨论】:

    标签: c# unit-testing objectbuilder


    【解决方案1】:

    您需要使用Action&lt;EquipmentModel&gt; 作为参数,而不是Func&lt;EquipmentModel&gt;

    public EquipmentModelBuilder With(Action<EquipmentModel> setter)
    {
        setter.Invoke(this.Object);
        return this;
    }
    

    【讨论】:

    • +1 可以放弃对.Invoke 的调用,留下更好的setter(this.Object)。然后将setter 重命名为initializeProperties(this.Object) :-)
    • @Adam:好点子。我个人更喜欢按照您描述的方式进行操作,而有些人喜欢使用“调用”。我认为这让他们感觉更加面向对象。
    【解决方案2】:

    我认为Func&lt;EquipmentModel&gt; 指定了一个返回 EquipmentModel 的函数,所以您想要的是一个 Action&lt;EquipmentModel&gt;,它指定一个没有返回的函数,它接受 EquipmentModel 作为参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2017-03-05
      • 1970-01-01
      • 2017-11-29
      • 2021-02-28
      • 2019-10-11
      • 1970-01-01
      相关资源
      最近更新 更多