如何将Build方法设置为在C#builder Fluent界面中调用的默认方法

时间:2013-06-01 12:11:17

标签: c# builder fluent-interface

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

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

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

的工作原理如下:

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

即。使Build方法成为默认方法,我知道有一种方法,但我忘了它。提前谢谢。

3 个答案:

答案 0 :(得分:3)

好吧,我不会实际推荐它,但你最接近的可能就是有一个从FooBuilderFoo的隐式转换运算符:

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调用的方法可以在最后验证所有内容,这意味着您无需担心。

答案 1 :(得分: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();

答案 2 :(得分: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();