委託

 
委託的用途有二:
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();
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章