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

使用字典存储事件实例
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;
        }
      }
    }
(0)

相关推荐

  • asp.net中c#自定义事件的实现方法详解

    本文实例讲述了asp.net中c#自定义事件的实现方法.分享给大家供大家参考.具体分析如下: c#自定义事件分为六步,声明关于事件的委托,声明事件,编写引发事件的函数,事件处理,这里我们就来具体的介绍一下. C#自定义事件的具体实现步骤如下: 1.声明一个delegate: (用于事件的类型的定义) 如: 复制代码 代码如下: public delegate void 事件名称EventHandler(object serder, EventArgs e); 事件名称用你的自己的来代替,随后的E

  • C#自定义事件监听实现方法

    本文实例讲述了C#自定义事件监听实现方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApp { /// <summary> /// 定义事件 /// </summary> class CustomEvent { /// <summary> /// 定义委托 /// &

  • C#自定义事件及用法实例

    本文实例讲述了C#自定义事件及用法.分享给大家供大家参考.具体分析如下: 事件是C#中一个重要的内容,MSDN上有一个自定义事件的演示示例.我看了半天有点晕,所以新建了一个winform工程添加了一个按钮,然后找出调用的程序,一对比做了一个类似的示例,就明白了.看代码有时候比看文档来得更快. 所以还是一贯的原则,来干的,不来稀的. using System; namespace TestEventArgs { /// <summary> /// 这个类对应于EventArgs,做对比学习. /

  • C#自定义事件模拟风吹草摇摆效果

    这是一个自定义事件的例子.C#.WinForm.Visual Studio 2017. 在HoverTreeForm中画一块草地,上面有许多草(模拟). HewenqiTianyi类模拟天气,会引发"风"事件(HoverTreeWindEvent),风有东风或西风,或静止. 当吹东风,草往西边倒,吹西风则往东边到.静止则草不会东歪西倒. 草地上每一颗草都监听HoverTreeWindEvent事件,根据风向(WindDdirection)调整姿态. HewenqiTianyi中有定时器

  • C#中自定义事件和委托实例

    在windows 编程中用到最多的就是控件的事件了,微软给我们很好的方式,把注意力放到事件执行方法的设计和编码上,但是但我们真正弄懂了事件的真正出发执行原理的话,对我们的编程的提高真是非常榜的,例如在windows编程中 如果我单击了一个button按钮触发了button 的click事件  Button1_Click(){} ,但是有时候我们编程的时候,不但想要触发button 的单击事件,我还想要把其他的时间也要调用下来顺序执行,要实现这种方式,除了在方法最后对其他方法的调用,还可以利用将其

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

    使用字典存储事件实例 accessor-declarations 的一种用法是公开很多事件但不为每个事件分配字段,而是使用字典来存储这些事件实例.这只在具有很多事件但您预计大多数事件都不会实现时才有用. public delegate void EventHandler1(int i); public delegate void EventHandler2(string s); public class PropertyEventsSample { private System.Collecti

  • 从Node.js事件触发器到Vue自定义事件的深入讲解

    Node.js中的事件触发器所引发的思考 今天在看 Node.js 文档的时候讲到事件触发器,其中的 emit 方法让我想到了 Vue 中的自定义事件,借此我对 Vue 又有了新的理解,所以将我的理解记录下来,留作学习笔记. Node.js中的事件触发器 Node.js 为我们提供了一个事件模块:EventEmitter,我们可以用它来处理事件 const EventEmitter = require('events') const eventEmitter = new EventEmitter

  • C#事件访问器详解

    我们可以通过为事件定义事件访问器,来控制事件运算符+=.-=运算符的行为 •有两个访问器:add和remove•声明事件的访问器看上去和声明一个属性差不多 下面示例演示了具有访问器的声明.两个访问器都有叫做value的隐式值参数,它接受实例或静态方法的引用 复制代码 代码如下: public event EventHandler Elapsed{    add    {        //... 执行+=运算符的代码    } remove     {        //... 执行-=运算符的

  • JavaScript 自定义事件之我见

    事件 技术一般水平有限,有什么错的地方,望大家指正. 事件就是用户和浏览器交互的一种途径.假如一个用户注册的功能,我们在填写完基本信息之后,点击提交按钮就可以实现注册功能,要想完成这个功能所需要的就是点击事件.我们预先定义好操作行为,在用户点击提交按钮时就执行我们预先定好的行为,在本例中我们的代码逻辑一般就是收集用户填写信息,验证信息合法性,利用AJAX与服务器交互. 这个过程就好像我们平时封装函数然后调用函数一样,事件其实也就类似函数定义函数调用这样的一个过程,只不过事件函数的调用是由用户的一

  • 详解JavaScript中的自定义事件编写

    我们可以自定义事件来实现更灵活的开发,事件用好了可以是一件很强大的工具,基于事件的开发有很多优势(后面介绍). 与自定义事件的函数有 Event.CustomEvent 和 dispatchEvent. 直接自定义事件,使用 Event 构造函数: var event = new Event('build'); // Listen for the event. elem.addEventListener('build', function (e) { ... }, false); // Disp

  • Angular4.x Event (DOM事件和自定义事件详解)

    Angular组件和DOM元素通过事件与外部进行通信,两者中的事件绑定语法是相同的-(eventName)="expression": <button (click)="onClick()">Click</button> DOM元素 DOM 元素触发的一些事件通过 DOM 层级结构传播,事件首先由最内层的元素开始,然后传播到外部元素,直到它们到根元素,这种传播过程称为事件冒泡. DOM事件冒泡与Angular可以无缝工作,具体示例如下: im

  • 详解javascript实现自定义事件

    我们平时在操作dom时候经常会用到onclick,onmouseover等一系列浏览器特定行为的事件, 那么自定义事件,顾名思义,就是自己定义事件类型,自己定义事件处理函数,在合适的时候需要哪个事件类型,就去调用哪个处理程序 1.js所支持的浏览器默认事件 浏览器特定行为的事件,或者叫系统事件,js默认事件等等都行,大家知道我指的什么就行,下文我叫他js默认事件. js默认事件的事件绑定,事件移出等一系列操作,相信大家都有用到过,如: //DOM0级事件处理程序 var oDiv = docum

  • vue如何自定义事件传参

    目录 自定义事件传参 先来简单看个例子 自定义事件的$event传参问题 原生vue里的$event 自定义事件里的$event 自定义事件传参 先来简单看个例子 TodoList.vue : <template>   <ul>     <li>       <todo-item         v-for="item in list" :key="item.id"         :status="doneLis

  • C#自定义事件之属性改变引发事件示例

    本文实例为大家分享了C#属性改变引发事件示例的具体代码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication15 { class Program { static void Main(string[] args) { Monitor m = new Monitor(); m.PropertyCha

  • js和jquery实现监听键盘事件示例代码

    项目中要监听键盘组合键CTRL+C,以便做出对应的响应.查了一些方法但是其兼容性和稳定性不是很高,最终得到如下方法,经测试在Firfox.Chrome.IE中均可以使用. 一.使用javascript实现 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script> function keyListener(e

随机推荐