日期:2014-05-20 浏览次数:20732 次
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(); }