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

直接上代码了,很简单的,一看就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();
        }
    }
}
原文地址:https://www.cnblogs.com/kk1230/p/2153143.html