委託的用途有二:
1.將方法作爲參數來傳遞方式有二
i. 委託顯示綁定方法
例:
定義:public delegate object PopulateDelegate(IDataReader dr);
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實體類的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();
/// <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;
}
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;
/// <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 ";
}
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();
// 取記錄總數
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;
}
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);
//定義委託,它定義了可以代表的方法的類型
public delegate void GreetingDelegate(string name);
class Program {
private static void EnglishGreeting(string name) {
Console.WriteLine("Morning, " + name);
}
Console.WriteLine("Morning, " + name);
}
private static void ChineseGreeting(string name) {
Console.WriteLine("早上好, " + name);
}
Console.WriteLine("早上好, " + name);
}
//注意此方法,它接受一個GreetingDelegate類型的方法作爲參數
private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {
MakeGreeting(name);
}
private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {
MakeGreeting(name);
}
static void Main(string[] args) {
GreetPeople("Jimmy Zhang", EnglishGreeting);
GreetPeople("張子陽", ChineseGreeting);
Console.ReadKey();
}
}
}
GreetPeople("Jimmy Zhang", EnglishGreeting);
GreetPeople("張子陽", ChineseGreeting);
Console.ReadKey();
}
}
}
輸出如下:
Morning, Jimmy Zhang
早上好, 張子陽
委託是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞,這種將方法動態地賦給參數的做法,可以避免在程序中大量使用If-Else(Switch)語句,同時使得程序具有更好的可擴展性。
2.事件爲了執行函數(方法),從而引入了委託.
例:
pubic delegate void PlayHandler();//委託 用於聯繫事件的函數
pubic delegate void PlayHandler();//委託 用於聯繫事件的函數
public class employee
{
public event PlayHandler PlayGame;//事件
public void games()
{
if(PlayGame!=null)
{
PlayGame();
}
}
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();
}
}
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();
}
}