我需要使用像下一个代码那样的构建器......
var foo = FooBuilder
.WithSomething()
.WithOtherthing();
或
var foo = FooBuilder
.WithOtherthing()
.WithSomething();
的工作原理如下:
var foo = FooBuilder
.WithSomething()
.WithOtherthing()
.Build();
即。使Build方法成为默认方法,我知道有一种方法,但我忘了它。提前谢谢。
答案 0 :(得分:3)
好吧,我不会实际推荐它,但你最接近的可能就是有一个从FooBuilder
到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
方法,因为这意味着您可以在最后执行验证 ,这意味着您无需担心验证取决于多个操作的顺序相关属性。
例如,如果您的类型具有DayOfMonth
和Month
属性,并且您想要从“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();