C#構文小知識(十三)戻り値付き依頼


依頼に関する基礎知識はC#構文小知識(四)依頼delegateを参照してください.ここでは戻り値付きの依頼をどのように処理するかについて議論します.
戻り値のある委任を宣言します.
public delegate string TestDel(string str);

次の操作を行います.
		TestDel t;
		t = (string str) => str;
		t += (string str) => str + "1";
		t += (string str) => str + "2";
		t += (string str) => str + "3";
		Console.WriteLine(t ("hhhh"));

(ここでリスニングを追加するには式Lambdaを使用し、C#構文の小知識(12)匿名メソッドとLambda式を参照)
ここでhhhh 3、すなわち最後のリスニングの戻り値が印刷されます.
すべての結果を印刷するにはどう書きますか?
システムに気づいたMultiCastDelegateにはGetInvocationListという方法があります
		foreach (TestDel td in t.GetInvocationList()) {
			Console.WriteLine(td.Invoke ("iiii"));
		}

これですべての戻り値が印刷されます.
この方法を使って私たちはいろいろなことをすることができます.
たとえば、UIコンポーネントに非表示にできるdelegateを追加できます.リスナーがfalseを返すと、このUIコンポーネントは非表示にできません.
public delegate bool CanClose();
		CanClose canCloseDelegate = null;
		canCloseDelegate += () => true;
		canCloseDelegate += () => false;
		bool canClose = true;
		foreach (CanClose del in canCloseDelegate.GetInvocationList()) {
			if (!del ()) {
				canClose = false;
				break;
			}
		}
		if (canClose) {
			//TODO: Hide the ui
		}

または、1つのオブジェクトに複数のデータソースを追加できます.
public delegate string DataSource();
		DataSource dsDelegate = null;
		dsDelegate += () => "Apple";
		dsDelegate += () => "Pen";
		dsDelegate += () => "Pineapple";
		List data = new List();
		foreach (DataSource ds in dsDelegate.GetInvocationList()) {
			data.Add (ds ());
		}
		Console.WriteLine (data.Count);