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, ... };
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] C#でenumからint値を取得する
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] LINQのGroup by
-
[解決済み] 汎用クラスやメソッドのメンバからTの型を取得する方法
-
[解決済み】大文字・小文字を区別しない「Contains(string)
-
[解決済み】TをEnumに拘束するGenericメソッドの作成
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】Nullableオブジェクトは値を持たなければならない?