手机
当前位置:查字典教程网 >编程开发 >C#教程 >在C#使用字典存储事件示例及实现自定义事件访问器
在C#使用字典存储事件示例及实现自定义事件访问器
摘要:使用字典存储事件实例accessor-declarations的一种用法是公开很多事件但不为每个事件分配字段,而是使用字典来存储这些事件实例...

使用字典存储事件实例

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#使用字典存储事件示例及实现自定义事件访问器】相关文章:

C#中使用反射获取结构体实例及思路

C# 创建文本文件写入读取实现代码

C#加密解密文件小工具实现代码

C#软件注册码的实现代码

在Winform和WPF中注册全局快捷键实现思路及代码

c# 调用.bat文件的实现代码

c#使用linq技术创建xml文件的小例子

c# 共享状态的文件读写实现代码

解析XPath语法之在C#中使用XPath的示例详解

c#调用存储过程实现登录界面详解

精品推荐
分类导航