我正在尝试编写DSL
我有返回字符串的方法,但如果我想组合字符串,我需要使用+符号,但我想将这些方法调用在一起,但我不确定如何实现它
目前我有方法,例如
MyStaticClass.Root() MyStaticClass.And() MyStaticClass.AnyInt()
返回字符串
我希望能够做到
Root().And().AnyInt()
导致字符串
答案 0 :(得分:3)
您不需要使用+符号。使用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;
问候。
答案 1 :(得分:1)
方法应该返回一个包装类。这些方法也是包装类的实例方法。例如:
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
到字符串的隐式或显式转换,而不是ToString()
覆盖(或除此之外)。
此外,对于生产代码,我使用字符串构建器来避免多次调用Concat
。