1

我正在尝试编写 DSL

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

我目前有方法,例如

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

我希望能够做到

Root().And().AnyInt()结果是一个字符串

4

2 回答 2

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;

问候。

于 2012-04-14T23:01:54.920 回答
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.

于 2012-04-14T23:05:13.517 回答