日期:2014-05-20 浏览次数:20908 次
class MainForm : Form
    {
        public MainForm()
        {
            this.Click += new EventHandler(MainForm_Click);
        }
        private void MainForm_Click(object sender, EventArgs e)
        {
        }
}
event MethodInvoker OneEvent;
event MethodInvoker OneEvent
        {
            add
            {
            }
            remove
            {
            }
        }
其中MethodInvoker
private MethodInvoker OneEvnet;
    class Demo
    {
        public void InvokeEvent()
        {
            if (OneEvent != null)
                OneEvent();//调用事件
            if (TwoEvent != null)
            {
                string str = TwoEvent(217);//调用事件
                MessageBox.Show(str);
            }
        }
        public event MethodInvoker OneEvent;
        public event Func<int, string> TwoEvent;
}
        private void button1_Click(object sender, EventArgs e)
        {
            Demo de = new Demo();
            de.OneEvent += delegate
            {
                MessageBox.Show("事件被调用");
            };
            de.TwoEvent += arg => arg.ToString();
            de.InvokeEvent();
        }
   class Demo
    {
        public void InvokeEvent()
        {
            if(ehl[oneEvent]!=null)
                ehl[oneEvent].DynamicInvoke();//调用事件
            if (ehl[twoEvent] != null)
            {
                string str = ehl[twoEvent].DynamicInvoke(217) as string;//调用事件
                MessageBox.Show(str);
            }
        }
        EventHandlerList ehl = new EventHandlerList();
        static readonly object oneEvent = new object();
        static readonly object twoEvent = new object();
        public event MethodInvoker OneEvent
        {
            //在add和remove访问器中,类似属性,存在一个value,表示要订阅和取消的委托
            add
            {
                //我这里的条件没有什么实际意义,只是想说明可以在访问器中执行代码
                //示例中,起到一个筛选的作用,只有那些以”On”开头,并且定义于其他类中的方法才能被订阅
                if (value.Method.Name.StartsWith("On") && value.Target != this)
                    ehl.AddHandler(oneEvent,value);
            }
            remove
            {
                //对不起,禁止你取消静态方法(为什么禁止取消静态方法?没有理由,只用于举例^-^)
                if (!value.Method.IsStatic)
                    ehl.RemoveHandler(oneEvent,value);
            }
        }
        public event Func<int, string> TwoEvent
        {
            add
            {
                ehl.AddHandler(twoEvent,value);
            }
            remove
            {
                ehl.RemoveHandler(twoEvent,value);
            }
        }
        public void OnCall()
        {
            MessageBox.Show("Demo.OnCall");
        }
    }
    class Pro
    {
        public void Call()
        {
            MessageBox.Show("Pro.Call");
        }
        public void OnCall()
        {
            MessageBox.Show("Pro.OnCall");
        }
        public static void OnCalls()
        {
            MessageBox.Show("Pro.Static.OnCalls");
        }
}
        private void button1_Click(object sender, EventArgs e)
        {
            Pro pr = new Pro();
            Demo de = new Demo();
            de.OneEvent += pr.Call;//不以”On”开头,不会订阅
            de.OneEvent += pr.OnCall;//成功订阅
            de.OneEvent += Pro.OnCalls;//成功订阅
            de.OneEvent += de.OnCall;//只有定义在其他类中的方法才会被订阅
            de.InvokeEvent();
            de.OneEvent -= pr.Call;//未订阅,谈不上取消
            de.OneEvent -= pr.OnCall;//成功取消
            de.OneEvent -= Pro.OnCalls;//静态方法不会被取消
            de.OneEvent -= de.OnCall; //未订阅,谈不上取消
            de.InvokeEvent();
    }