Posted at

何でもメソッドチェーンしたい

More than 3 years have passed since last update.

メソッドが自分自身のインスタンスを返すパターンであれば、メソッドチェーンが成り立ちます。


一時変数を用意したくない

次のコードは、hoge.Piyo.Valueを設定する目的のためだけに変数を用意しています。



Sample hoge = new Sample();

hoge.Piyo.Value = 100;

list.Add( hoge ); // vodeを返す

`

もしも、List.AddメソッドがSample型を返すと、メソッドチェーンできるので

わざわざ hoge 変数を用意する必要が無くなります。

list.Add( new Sample() ).Piyo.Value = 100;

とはいえ、ほとんどのメソッドは、メソッドチェーンを考慮しておらず、また無闇にそのような実装にするのは、あまり宜しくありません。


拡張メソッド

そこで、次のような拡張メソッドを用意することで、メソッドチェーンを実現できます。

やっていることは、単純で、デリゲートを処理して、自分自身を返すだけです。

public static T Chain<T>( this T source , Action<T> call ) {

if( source == null )
return source;
call( source );
return source;
}


使い方

new Sample()

.Chain( x => x.Piyo.Value = 100 )
.Chain( x => list.Add( x ) );