• 实现事件只能注册一次,自定义事件访问器


    直接上代码了,很简单的,一看就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();
            }
        }
    }
  • 相关阅读:
    Dynamics AX 2012 R2 在增强入站端口中找不到自定义服务操作
    Dynamics AX 2012 R2 切换环境后项目导入报错
    win8以上版本离线安装.NET
    Pro ASP.NET MVC 5 Framework.学习笔记.6.4.MVC的必备工具
    Pro ASP.NET MVC 5 Framework.学习笔记.6.3.MVC的必备工具
    vs2010 仿XCode风格的头注释宏
    [转]微软SerialPort秘籍[SerialPort为什么死锁程序的分析]
    jqGrid中选择的行的数据[转]
    【JQGRID DOCUMENTATION】.学习笔记.6.Editing:Common Rules
    【JQGRID DOCUMENTATION】.学习笔记.5.Form Editing
  • 原文地址:https://www.cnblogs.com/kk1230/p/2153143.html
Copyright © 2020-2023  润新知