2

流暢なインターフェイスの基本的な機能の 1 つは、従来は として宣言されていたメソッドが、void代わりに使用可能なもの、ほとんどの場合、それらが属するクラスのインスタンス (つまりthis) を返すことです。StringBuilder はこの規則の例であり、それ自体は完全に流暢ではありませんが、チェーンされたメソッド呼び出しの利便性を提供します。

sb.Append("Foo")
  .Append("Bar")
  .AppendLine();

System.Web.Mvc.TagBuilderただし、この規則には従いません。メソッドはすべてvoidです。

これを整理する手っ取り早い汚い方法は、プライベート TagBuilder( _instance) をFluentTagBuilderクラスにカプセル化し、同じメソッドをすべて実装して、作業をインスタンスに委譲し、this代わりに返すことですvoid

これを達成するための、それほど迅速で汚い方法ではない最良の方法は何ですか? メソッドは戻り値の型によってのみ異なるため、継承は明らかに機能しません。私はそれをシンプルに保ち、可能であればモック/代用フレームワークを使用したくありません。共有できる知恵をありがとう!

4

2 に答える 2

2

ビルダー オブジェクトを伝播する拡張メソッドを作成できます。

public static T Do<T>(this T obj, Action<T> action)
{
    action(obj);
    return obj;
}

TagBuilder builder;
builder.Do(b => b.SetInnerText("text"))
       .Do(b => b.AddCssClass("class"))
       .Do(b => b.GenerateId("id"));
于 2013-02-20T23:12:45.620 に答える
1

小さな Git リポジトリを作成し、これを行うためのツールを開始しました。

それは非常にアマチュアであり、コーディングが不十分であり、多くの問題がありますが、非常にシンプルであり、適応させることができます。

Fluentizer はクラスを取得し、リフレクションによって新しいクラスを生成し、元のメソッドをカプセル化します。

ここでFluentizerをチェックしてください。

于 2013-02-21T11:27:43.360 に答える