设计Fluent界面方法

我正在尝试编写DSL

我有返回字符串的方法,但如果我想组合字符串,我需要使用+符号,但我想一起调用这些方法,但我不确定如何实现它

我现在有方法如

MyStaticClass.Root() MyStaticClass.And() MyStaticClass.AnyInt()返回字符串的MyStaticClass.Root() MyStaticClass.And() MyStaticClass.AnyInt()

我希望能够做到

Root().And().AnyInt()导致字符串

这些方法应该返回一个包装类。 这些方法也是包装类的实例方法 。 例:

 class Fluent { private string _value; public Fluent And() { this._value += "whatever"; return this; } public Fluent AnyInt() { this._value += "42"; return this; } public override string ToString() { return _value; } } 

您还可以定义从Fluent到string的隐式或显式转换,而不是(或除了) ToString()覆盖。

此外,对于生产代码,我使用字符串生成器来避免对Concat多次调用。

您不需要使用+符号。 使用StringBuilder http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

 StringBuilder builder = new StringBuilder(); builder.Append("One string ").Append("Second string").Append("Another string"); string final = builder.ToString(); 

如果您想要一个简单的自定义FluentInterface,请使用以下命令:

 public class MyOwnStringBuilder { public StringBuilder Builder; public MyOwnStringBuilder() { this.Builder = new StringBuilder(); } public static MyOwnStringBuilder Root { get{return new MyOwnStringBuilder();} } public string End { get{return Builder.ToString();} } public MyOwnStringBuilder And(string value) { Builder.Append(value); return this; } public MyOwnStringBuilder AnyInt(string value) { Builder.Append(value); return this; } } 

你会用它:

 MyOwnStringBuilder.Root .And("some value") .AnyInt("some new value") .End; 

问候。