1

私はDSLを書こうとしています

文字列を返すメソッドがありますが、文字列を結合したい場合は + 記号を使用する必要がありますが、メソッドを一緒に呼び出したいのですが、それを実現する方法がわかりません

私は現時点で次のような方法を持っています

MyStaticClass.Root() MyStaticClass.And() MyStaticClass.AnyInt()文字列を返す

できるようになりたい

Root().And().AnyInt()結果は文字列になります

4

2 に答える 2

3

+ 記号を使用する必要はありません。http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspxを使用StringBuilder

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 に答える