在C#使用字典存储事件示例及实现自定义事件访问器

作者:goldensun 时间:2022-08-14 14:34:52 

使用字典存储事件实例
accessor-declarations 的一种用法是公开很多事件但不为每个事件分配字段,而是使用字典来存储这些事件实例。这只在具有很多事件但您预计大多数事件都不会实现时才有用。


public delegate void EventHandler1(int i);
public delegate void EventHandler2(string s);

public class PropertyEventsSample
{
 private System.Collections.Generic.Dictionary<string, System.Delegate> eventTable;

public PropertyEventsSample()
 {
   eventTable = new System.Collections.Generic.Dictionary<string, System.Delegate>();
   eventTable.Add("Event1", null);
   eventTable.Add("Event2", null);
 }

public event EventHandler1 Event1
 {
   add
   {
     lock (eventTable)
     {
       eventTable["Event1"] = (EventHandler1)eventTable["Event1"] + value;
     }
   }
   remove
   {
     lock (eventTable)
     {
       eventTable["Event1"] = (EventHandler1)eventTable["Event1"] - value;
     }
   }
 }

public event EventHandler2 Event2
 {
   add
   {
     lock (eventTable)
     {
       eventTable["Event2"] = (EventHandler2)eventTable["Event2"] + value;
     }
   }
   remove
   {
     lock (eventTable)
     {
       eventTable["Event2"] = (EventHandler2)eventTable["Event2"] - value;
     }
   }
 }

internal void RaiseEvent1(int i)
 {
   EventHandler1 handler1;
   if (null != (handler1 = (EventHandler1)eventTable["Event1"]))
   {
     handler1(i);
   }
 }

internal void RaiseEvent2(string s)
 {
   EventHandler2 handler2;
   if (null != (handler2 = (EventHandler2)eventTable["Event2"]))
   {
     handler2(s);
   }
 }
}

public class TestClass
{
 public static void Delegate1Method(int i)
 {
   System.Console.WriteLine(i);
 }

public static void Delegate2Method(string s)
 {
   System.Console.WriteLine(s);
 }

static void Main()
 {
   PropertyEventsSample p = new PropertyEventsSample();

p.Event1 += new EventHandler1(TestClass.Delegate1Method);
   p.Event1 += new EventHandler1(TestClass.Delegate1Method);
   p.Event1 -= new EventHandler1(TestClass.Delegate1Method);
   p.RaiseEvent1(2);

p.Event2 += new EventHandler2(TestClass.Delegate2Method);
   p.Event2 += new EventHandler2(TestClass.Delegate2Method);
   p.Event2 -= new EventHandler2(TestClass.Delegate2Method);
   p.RaiseEvent2("TestString");

// Keep the console window open in debug mode.
   System.Console.WriteLine("Press any key to exit.");
   System.Console.ReadKey();
 }
}

输出:


 2
 TestString


实现自定义事件访问器
事件是特殊类型的多路广播委托,只能从声明它的类中调用。客户端代码通过提供对应在引发事件时调用的方法的引用来订阅事件。这些方法通过事件访问器添加到委托的调用列表中,事件访问器类似于属性访问器,不同之处在于事件访问器被命名为 add 和 remove。在大多数情况下都不需要提供自定义的事件访问器。如果您在代码中没有提供自定义的事件访问器,编译器会自动添加事件访问器。但在某些情况下,您可能需要提供自定义行为。下面的示例演示如何实现自定义的 add 和 remove 事件访问器。虽然可以替换这些访问器内的任何代码,但建议您在添加或移除新的事件处理程序方法之前先锁定该事件。


event EventHandler IDrawingObject.OnDraw
   {
     add
     {
       lock (PreDrawEvent)
       {
         PreDrawEvent += value;
       }
     }
     remove
     {
       lock (PreDrawEvent)
       {
         PreDrawEvent -= value;
       }
     }
   }
标签:C#,字典,事件,访问器
0
投稿

猜你喜欢

  • SpringBoot统一响应格式及统一异常处理

    2022-08-30 08:03:08
  • Mybatis-Plus自动填充更新操作相关字段的实现

    2022-01-14 20:43:01
  • Java集合的Collection接口和List接口详解

    2021-11-02 05:24:44
  • C#基础之异步调用实例教程

    2021-07-03 08:44:56
  • Java中Date日期时间类具体使用

    2022-04-11 23:18:13
  • Java开发微信公众号接收和被动回复普通消息

    2022-04-07 12:30:44
  • Ajax登录验证实现代码

    2022-02-22 10:47:51
  • C#用匿名方法定义委托的实现方法

    2021-07-08 22:49:07
  • MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)

    2023-11-29 05:02:37
  • hadoop中实现java网络爬虫(示例讲解)

    2021-12-22 01:35:20
  • Java操作Redis2种方法代码详解

    2022-09-10 22:58:56
  • java compare compareTo方法区别详解

    2022-06-26 08:13:55
  • Android仿百度图片查看功能

    2023-09-26 07:50:24
  • C#简单遍历指定文件夹中所有文件的方法

    2022-12-16 18:42:27
  • 可视化Swing中JTable控件绑定SQL数据源的两种方法深入解析

    2023-11-28 19:13:58
  • Spring Boot集成MyBatis实现通用Mapper的配置及使用

    2023-07-03 18:17:10
  • WPF开发技巧之花式控件功能扩展详解

    2022-07-13 05:56:52
  • java中单例模式讲解

    2022-05-22 14:24:07
  • Java实现发红包功能

    2023-12-09 10:33:03
  • Springboot启动执行特定代码的方式汇总

    2023-08-06 04:42:24
  • asp之家 软件编程 m.aspxhome.com