孤星无泪

 

委托示例(1)

可以把委托视为“方法”的类型,这样就可以把方法作为参数来传递了。什么时候需要使用委托?下面来例举一个例子说明。

假设我们需要对许多文本框设置属性:

 

比如我们要设置前景色、背景色,普通的编码会是这样的:

设置前景色:

       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类型,枚举类型的方法用委托抽象出来,试一下吧!

 

posted on 2013-11-24 21:12  孤星无泪  阅读(243)  评论(0)    收藏  举报

导航