我正在尝试编写 DSL
我有返回字符串的方法,但如果我想组合字符串,我需要使用 + 符号,但我想一起调用这些方法,但我不确定如何实现它
我目前有方法,例如
MyStaticClass.Root() MyStaticClass.And() MyStaticClass.AnyInt()
返回字符串
我希望能够做到
Root().And().AnyInt()
结果是一个字符串
我正在尝试编写 DSL
我有返回字符串的方法,但如果我想组合字符串,我需要使用 + 符号,但我想一起调用这些方法,但我不确定如何实现它
我目前有方法,例如
MyStaticClass.Root() MyStaticClass.And() MyStaticClass.AnyInt()
返回字符串
我希望能够做到
Root().And().AnyInt()
结果是一个字符串
您不需要使用 + 符号。使用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;
问候。
这些方法应该返回一个包装类。这些方法也是包装类的实例方法。例子:
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
.