直接上代碼了,很簡單的,一看就OK
using System;
using System.Collections.Generic;
using System.Text;
namespace DelegateTest
{
class Program
{
static void Main(string[] args)
{
Pig p = new Pig();
p.Single += new Pig.SingleDel(p_Single1);
p.Single += new Pig.SingleDel(p_Single2);
p.Mulit += new Pig.MulitDel(p_Mulit1);
p.Mulit += new Pig.MulitDel(p_Mulit2);
p.TriggerSingle();
p.TriggerMulit();
Console.Read();
}
static void p_Mulit1()
{
Console.WriteLine( "第一次註冊Mulit ");
}
static void p_Mulit2()
{
Console.WriteLine( "第二次註冊Mulit ");
}
static void p_Single1()
{
Console.WriteLine("第一次註冊Single ");
}
static void p_Single2()
{
Console.WriteLine("第二次註冊Single ");
}
}
public class Pig
{
public delegate void SingleDel(); //單播,只能被訂閱一次(自訂訪問器來實現)修改add裡面的邏輯可以實現其它註冊方式
public delegate void MulitDel();//多播,可以被訂閱多次
public Pig()
{
}
private event SingleDel single;
public event SingleDel Single
{
add
{
if (single != null)
{
Delegate[] dels = single.GetInvocationList();
if (dels.Length > 0)
{
foreach (Delegate i in dels)
{
single = Delegate.Remove(single, i) as SingleDel;
}
}
single = Delegate.Combine(single, value) as SingleDel;
}
else
single += value;
}
remove
{
if (single == null)
return;
single -= value;
}
}
public event MulitDel Mulit;
public void TriggerSingle()
{
if (single != null)
single();
}
public void TriggerMulit()
{
if (Mulit != null)
Mulit();
}
}
}