Emit学习-进阶篇-定义事件2011-09-03 博客园 yingql之前在研究如何用Emit为动态类添加事件,本来以为会非常简单,但是却碰到 了许多的问题,有些问题在之前的答疑篇中已经提到了,并予以了解决,虽然有 些地方自己也不是很明白,但毕竟还是解决了,最后比较我写的IL代码,和系统 自动生成的,总有一些地方无法做到一致。特别是在为事件添加add和remove方法 时,碰到了许多问题,下面我将针对这些问题进行讲解。按照惯例,先给出要实 现的类的C#代码,方便反编译后对照着进行IL代码的书写,代码如下:Publisher
public class Publisher{ private bool isStart = false; private Random random = new Random(DateTime.Now.Millisecond); public void Start() { if (!isStart) { isStart = true; GenerateRand(); } } public void Stop() { isStart = false; } private void GenerateRand() { while (isStart) { OnRandGenerated(random.Next(10000)); Thread.Sleep(1000); } } #region Event public event EventHandler<RandGeneratedEventArgs> RandGenerated; protected virtual void OnRandGenerated(int rand) { RaiseRandGeneratedEvent(rand); } private void RaiseRandGeneratedEvent(int rand) { EventHandler<RandGeneratedEventArgs> temp = RandGenerated; if (temp != null) { RandGeneratedEventArgs arg = new RandGeneratedEventArgs(rand); temp(this, arg); } } #endregion }