可以把委托视为“方法”的类型,这样就可以把方法作为参数来传递了。什么时候需要使用委托?下面来例举一个例子说明。
假设我们需要对许多文本框设置属性:
比如我们要设置前景色、背景色,普通的编码会是这样的:
设置前景色:
if (colorDialog.ShowDialog() == DialogResult.OK) { foreach (Control temp in FlpControls.Controls) { temp.ForeColor = colorDialog.Color; } }
设置背景色
if (colorDialog.ShowDialog() == DialogResult.OK) { foreach (Control temp in FlpControls.Controls) { temp.BackColor = colorDialog.Color; } }
发现什么问题没有,大体的逻辑都是一样的,都是使用了foreach循环,就是foreach循环里面的代码不一样。那么能不能想个办法,把foreach循环通用?
下面我们定义一个委托:
/// <summary> /// 设置控件颜色属性相关的委托 /// </summary> /// <param name="ctl">控件</param> /// <param name="property">颜色</param> public delegate void DelegateSetControlColor(Control ctl,Color property);
然后定义一个设置与颜色相关的通用方法
/// <summary> /// 设置控件属性 /// </summary> /// <param name="flp">存放文本框控件的控件</param> /// <param name="setColor">定义控件颜色的相关委托</param> /// <param name="propervalue">相关的颜色</param> public static void SetProperties(FlowLayoutPanel flp, DelegateSetControlColor setColor, Color propervalue) { foreach (Control temp in flp.Controls) { setColor(temp, propervalue); } }
注意:参数setColor是一个方法。这样foreach循环就通用了,那具体该这么用呢?
设置前景色
if (colorDialog.ShowDialog() == DialogResult.OK) { //SetControlForeColor是设置前景色的具体方法 SetControlProperties.SetProperties(FlpControls, SetControlForeColor, colorDialog.Color); }
设置背景色
if (colorDialog.ShowDialog() == DialogResult.OK) { //SetControlBackColor是设置背景色的具体方法 SetControlProperties.SetProperties(FlpControls, SetControlBackColor, colorDialog.Color); }
而具体设置前景色和背景色的方法是这样的:
#region 设置与控件颜色相关的具体方法 /// <summary> /// 设置背景色 /// </summary> /// <param name="ctl">控件</param> /// <param name="color">背景色</param> public static void SetControlBackColor(Control ctl, Color color) { ctl.BackColor = color; } /// <summary> /// 设置前景色 /// </summary> /// <param name="ctl">控件</param> /// <param name="color">前景色</param> public static void SetControlForeColor(Control ctl, Color color) { ctl.ForeColor = color; } #endregion
这样用了委托有以下好处:
1 通用了同样的逻辑块foreach循环;
2 由于具体方法从具体的逻辑块中剥离了,是独立的方法,一样可以重复使用。
同样,我们可以把属性为int类型,枚举类型的方法用委托抽象出来,试一下吧!