1

我需要那个,使用像下一个代码这样的构建器......

var foo = FooBuilder
          .WithSomething()
          .WithOtherthing();

或者

var foo = FooBuilder
          .WithOtherthing()
          .WithSomething();

工作方式如下:

var foo = FooBuilder
          .WithSomething()
          .WithOtherthing()
          .Build();

ie 将 Build 方法设为默认值,我知道有一种方法,但我忘记了。提前致谢。

4

3 回答 3

3

好吧,我实际上并不推荐它,但最接近的方法是使用隐式转换运算符 from FooBuilderto Foo

public static implicit operator Foo(FooBuilder builder)
{
    return builder.Build();
}

但是,您需要明确键入变量:

Foo foo = FooBuilder
             .WithSomething()
             .WithOtherthing();

顺便说一句,尚不清楚您刚刚写的时候是否真的是指这里。我个人更喜欢创建具有可设置属性的构建器,它允许您使用对象初始值设定项。例如:new FooBuilder()FooBuilder

// With the implicit conversion from FooBuilder to Foo
Foo foo = new FooBuilder { Name = "Fred", Value = 10 };

// Without the implicit conversion
var foo = new FooBuilder { Name = "Fred", Value = 10 }.Build();

这是假设您实际上想要一个单独的FooBuilder类型。如果您很高兴Foo为每个“伪突变”创建一个新实例,那么您可以使用 jure 的选项。我个人喜欢单独的Build方法,因为这意味着您可以在最后执行验证这意味着您无需担心验证依赖于多个相关属性的操作的顺序。

例如,如果您有一个具有DayOfMonthMonth属性的类型,并且您想从“1 月 30 日”更改为“2 月 20 日”,那么在“在每个步骤上创建一个新的验证对象”中,您需要更改月份中的日期首先,然后是月份……但如果您要从“2 月 20 日”到“1 月 30 日”,则必须反过来。使用单独的构建器类型和最终验证所有内容的单个Build调用的方法意味着您无需担心。

于 2013-06-01T12:50:05.983 回答
0

如果您正在创建自己的构建器接口,您可以通过扩展方法来实现与您正在构建的类类似的东西

public static class FooExtensions
{
  public static Foo WithSomething(this Foo foo)
  {
    //do your thing with foo
    ....

    return foo;
  }

  public static Foo WithOtherthing(this Foo foo)
  {
     //do your thing with foo
    ....

     return foo;
  }
}

然后将其用作

  var foo = new Foo().WithSomething().WithOtherthing();
于 2013-06-01T12:42:54.583 回答
0

具有这种行为的FluentBuilder是通过扩展方法实现的

public static class FluentBuilder
{
    public static Foo Build()
    {
        return new Foo();
    }

    public static Foo WithSomething(this Foo foo)
    {
        foo.Something = new Something();
        return foo;
    }

    public static Foo WithOtherThing(this Foo foo)
    {
        foo.OtherThing = new OtherThing();
        return foo;
    }
}

用法:

var foo1 = FluentBuilder.Build();
var foo2 = FluentBuilder.Build().WithSomething().WithOtherThing();
var foo3 = FluentBuilder.Build().WithOtherThing().WithSomething();
于 2013-06-01T12:52:41.113 回答