委托的用途有二:
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();
}
}