实现事件只能注册一次,自定义事件访问器
2011-08-25 13:03
405 查看
直接上代码了,很简单的,一看就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();
}
}
}
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();
}
}
}
相关文章推荐
- django 实现同一个ip十分钟内只能注册一次(redis版本)
- django 实现同一个ip十分钟内只能注册一次
- django实现同一个ip十分钟内只能注册一次的实例
- C#--关于事件的定义及注册,如何实现在一个文本框中只输入数字或者只能输入0至9十种数字、a至z或A至Z五十二种字符。
- Python编程django实现同一个ip十分钟内只能注册一次
- 使用逻辑数据库PCH的时候,如何实现一次只能选择一个OBJID的效果?
- 实现一个只能实例化一次的类 即 单例模式(Singleton)
- Windows_通过共享数据段(data_seg())实现应用程序只能被创建一次
- Ext中一次给一个组件注册多个事件
- WPF与MVVM的实现(五)注册路由事件
- jQuery实现全选、全不选和反选,没有只能选一次的bug
- C#(WinForm)实现软件只能启动一次,再次启动会将已启动的软件置顶显示
- 一个程序只能启动一次实现
- 如何实现链接只能被点击一次
- 用C#实现一个类,要求该类只能被实例化一次
- Delphi实现Android 广播事件监听(动态注册广播)
- 一次提交实现注册或修改信息并上传图片文件
- 使用Session实现一个用户只能登录一次
- 编写登录接口,输入用户名密码,认证成功后显示欢迎界面,输错三次后锁定(1.超过三次直接锁定待实现 2.锁定后只能尝试一次)
- 用js实现只能点击一次的按钮的功能