2012-02-08 6 views
3

私が開発しているコードを調べているうちに、Console.WriteLineを投げ捨てたり、プログラムが実行されたときに値が表示されることがあります。 Console.WriteLineの欠点は、式を括弧で囲む必要があり、おそらくそれを分解しなければならないということです。例えば、この表現与えられた:すぐに検査するのに便利なインライン表示方法

a().b().c(); 

をさんは、私がb()の値を印刷したいとしましょう。私は次のようなことをする必要があります:

var val = a().b(); 

Console.WriteLine(val); 

val.c(); 

値を見るためにはちょうど編集が大変です。私は、全体の式の値を変更することなく、任意のメソッドチェーンでDispへの呼び出しを挿入することができます

public static T Disp<T>(this T obj) 
{ 
    Console.WriteLine(obj); 
    return obj; 
} 

私のソリューションは、この拡張メソッドを使用することでした。上記の例ではb()の結果を確認するには、私がやるだろう:

a.().b().Disp().c() 

私の質問は、ある既に.NETでDispのようないくつかの方法がありますか? Dispを実装するより良い方法はありますか?この手法に欠点がありますか?

更新2012-02-09

Iはまた、書式文字列を受け付けるオーバーロードされたバージョンを追加しました:

public static T Disp<T>(this T obj, string format) 
{ 
    Console.WriteLine(string.Format(format, obj)); 
    return obj; 
} 

答えて

2

あなたはAction<T>パラメータを持つことが、より一般的なことを検討かもしれませんが、私は、それで問題が表示されていない。

public static T Tap<T>(this T obj, Action<T> act) 
{ 
    act(obj); 
    return obj; 
} 

これはRubyでTapに似ています。 LINQPadへのポインタとその `Dump`方法について

a.().b().Tap(Console.WriteLine).c() 
+0

よろしくお願いします。しかし、私はおそらく 'Disp'を短縮形の表記として' Tap 'という言葉で定義しています。 – dharmatech

1

LINQPadは、まさにこのようにDump拡張メソッドを使用します。

唯一の欠点は、すべての拡張メソッドに共通です。

  1. 拡張メソッドは、静的であり、彼らの行動をオーバーライドするという点で、あなたの柔軟性を制限します。
  2. 拡張メソッドの名前空間を「使用している」ファイルでは、すべてのオブジェクトに対してこのメ​​ソッドが表示されます。 Intellisenseが混乱し、名前の衝突の危険があります。
+0

感謝を:代わりにあなたが行うことができますDump方法の

! – dharmatech

関連する問題