设计Fluent界面方法

时间:2012-04-14 22:47:47

标签: c# .net linq generics fluent-interface

我正在尝试编写DSL

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

目前我有方法,例如

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

我希望能够做到

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

2 个答案:

答案 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