委托

 
委托的用途有二:
1.将方法作为参数来传递方式有二
  i. 委托显示绑定方法
     例:
   定义:public delegate object PopulateDelegate(IDataReader dr);
     调用方法:
 /// <summary>
        /// 返回sys_RolesTable实体类的ArrayList对象
        /// </summary>
        /// <param name="qp">查询类</param>
        /// <param name="RecordCount">返回记录总数</param>
        /// <returns>sys_RolesTable实体类的ArrayList对象</returns>
        public override ArrayList sys_RolesList(QueryParam qp, out int RecordCount)
        {
            PopulateDelegate mypd = new PopulateDelegate(base.Populatesys_Roles);
            return this.GetObjectList(mypd, qp, out RecordCount);   
        }
     关联方法:
  /// <summary>
        /// 将记录集转为sys_RolesTable实体类
        /// </summary>
        /// <param name="dr">记录集</param>
        /// <returns>sys_RolesTable</returns>
        protected object Populatesys_Roles(IDataReader dr)
        {
            sys_RolesTable nc = new sys_RolesTable();
            if (!Convert.IsDBNull(dr["RoleID"])) nc.RoleID = Convert.ToInt32(dr["RoleID"]); // 角色ID自动ID
            if (!Convert.IsDBNull(dr["R_UserID"])) nc.R_UserID = Convert.ToInt32(dr["R_UserID"]); // 角角所属用户ID
            if (!Convert.IsDBNull(dr["R_RoleName"])) nc.R_RoleName = Convert.ToString(dr["R_RoleName"]).Trim(); // 角色名称
            if (!Convert.IsDBNull(dr["R_Description"])) nc.R_Description = Convert.ToString(dr["R_Description"]).Trim(); // 角色介绍
            return nc;
        }
 返回方法中调用委托中关联的方法:
/// <summary>
        /// 公共查询数据函数Access版
        /// </summary>
        /// <param name="pd">委托对象</param>
        /// <param name="pp">查询字符串</param>
        /// <param name="RecordCount">返回记录总数</param>
        /// <returns>返回记录集ArrayList</returns>
        private ArrayList GetObjectList(PopulateDelegate pd, QueryParam pp, out int RecordCount)
        {
            ArrayList lst = new ArrayList();
            RecordCount = 0;
            using (OleDbConnection Conn = GetSqlConnection())
            {
                StringBuilder sb = new StringBuilder();
                OleDbCommand cmd = new OleDbCommand();
                OleDbDataReader dr = null;
                cmd.Connection = Conn;
                int TotalRecordForPageIndex = pp.PageIndex * pp.PageSize;
                string OrderBy;
                string CutOrderBy;
                if (pp.OrderType == 1)
                {
                    OrderBy = " Order by " + pp.Orderfld.Replace(","," desc,") + " desc ";
                    CutOrderBy = " Order by " + pp.Orderfld.Replace(","," asc,") + " asc ";
                }
                else
                {
                    OrderBy = " Order by " + pp.Orderfld.Replace(",", " asc,") + " asc ";
                    CutOrderBy = " Order by " + pp.Orderfld.Replace(",", " desc,") + " desc ";
                }
                Conn.Open();
                // 取记录总数
                cmd.CommandText = string.Format("SELECT Count(1) From {0} {1}", pp.TableName, pp.Where);
                RecordCount = Convert.ToInt32(cmd.ExecuteScalar());
                cmd.Parameters.Clear();
                int CurrentPageSize = pp.PageSize;
                if ((RecordCount - 1) / pp.PageSize + 1 == pp.PageIndex)
                {
                    CurrentPageSize = RecordCount % pp.PageSize;
                    if (CurrentPageSize == 0)
                        CurrentPageSize = pp.PageSize;
                }
                //取记录值
                sb.AppendFormat("SELECT * FROM (SELECT TOP {0} * FROM (SELECT TOP {1} {2} FROM {3} {4} {5}) TB2 {6}) TB3 {5} ", CurrentPageSize, TotalRecordForPageIndex, pp.ReturnFields, pp.TableName, pp.Where, OrderBy, CutOrderBy);
                cmd.CommandText = sb.ToString();
                dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    lst.Add(pd(dr));
                }
                dr.Close();
                dr.Dispose();
                dr.Close();
                cmd.Dispose();
                Conn.Dispose();
                Conn.Close();
            }
            return lst;
        }

  ii.委托动态传递方法
     例:
  
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate {
       //定义委托,它定义了可以代表的方法的类型
       public delegate void GreetingDelegate(string name);
       class Program {
              private static void EnglishGreeting(string name) {
                     Console.WriteLine("Morning, " + name);
              }
              private static void ChineseGreeting(string name) {
                     Console.WriteLine("早上好, " + name);
              }
              //注意此方法,它接受一个GreetingDelegate类型的方法作为参数
              private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {
                     MakeGreeting(name);
              }
              static void Main(string[] args) {
                     GreetPeople("Jimmy Zhang", EnglishGreeting);
                     GreetPeople("张子阳", ChineseGreeting);
                     Console.ReadKey();
              }
       }
}

输出如下:
Morning, Jimmy Zhang
早上好, 张子阳
 
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

2.事件为了执行函数(方法),从而引入了委托.
 例:
pubic delegate void PlayHandler();//委托 用于联系事件的函数
public class employee
{
public event PlayHandler PlayGame;//事件
public void games()
{
if(PlayGame!=null)
{
PlayGame();
}
}
 
}
public class admin
{
public void nofy()
{
  system.console.write("i looked");
}
}
pubic class test()
{
  public void main()
{
  employee e=new employee();
    admin a=new admin();
e.PlayName+=new PlayHandler(a.nofy);
e.games();
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章