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#语法小知识(十二)匿名方法与Lambda表达式)

这里会打印hhhh3,也就是最后一个监听的返回值。

如果要打印所有的结果该怎么写?

我们注意到System.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
		}

或者可以为一个对象添加多个数据源。

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);


你可能感兴趣的:(C#,C#编程小知识)