委托示例(1)

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

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

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

 

你可能感兴趣的:(示例)