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