1. ホーム
  2. c#

C#のメソッドチェイニング

2023-08-03 12:11:06

質問

私はこれがC#で呼ばれるものであることを実際に知りません。 しかし、私は同時に複数のアイテムを追加するために私のクラスに関数を追加したい。

myObj.AddItem(mItem).AddItem(mItem2).AddItem(mItem3);

どのように解決するのですか?

ご指摘の手法は、連鎖性メソッドと呼ばれるものです。これは DSL を作成するときによく使われます。 流暢なインターフェイス を作るときによく使われます。

典型的なパターンは、AddItem()メソッドがその一部であるクラス(またはインターフェイス)のインスタンスを返すようにすることです。これにより、後続の呼び出しがそれに連鎖することができます。

public MyCollection AddItem( MyItem item )
{
   // internal logic...

   return this;
}

コレクションにアイテムを追加するための、メソッドチェイニングの代替案としては、以下のものがあります。

コレクションにアイテムを追加するために params 構文を使用すると、複数のアイテムを配列としてメソッドに渡すことができます。配列の作成を隠して、メソッドに変数の引数構文を提供したい場合に便利です。

public void AddItems( params MyItem[] items )
{
    foreach( var item in items )
        m_innerCollection.Add( item );
}

// can be called with any number of arguments...
coll.AddItems( first, second, third );
coll.AddItems( first, second, third, fourth, fifth );

IEnumerable または IEnumerable 型のオーバーロードを提供することで、コレクションクラスに複数のアイテムを一緒に渡すことができます。

public void AddItems( IEnumerable<MyClass> items )
{
    foreach( var item in items )
         m_innerCollection.Add( item );
}

.NET 3.5のコレクション・イニシャライザー構文を使用します。あなたのクラスは、単一のパラメータ Add( item ) メソッドを提供し、IEnumerable を実装し、デフォルトのコンストラクタを持たなければなりません(または、初期化ステートメントで特定のコンストラクタを呼び出す必要があります)。そうすれば、書くことができます。

var myColl = new MyCollection { first, second, third, ... };