110,546
社区成员
发帖
与我相关
我的任务
分享
class MainForm : Form
{
public MainForm()
{
this.Click += new EventHandler(MainForm_Click);
}
private void MainForm_Click(object sender, EventArgs e)
{
}
}
当然,还可以对代码进行简化,如类型的自动推断,匿名方法,Lambda表达式等。这个事件大概的工作流程为:当用户单击窗体时,操作系统向应用程序发送一系列消息,如左键按下和左键抬起,应用程序将通过GetMessage等方法最终将消息提交到窗口过程(WndProc),窗口过程通过处理消息,当发现产生了连续的左键按下和左键抬起的消息后,event MethodInvoker OneEvent;
event MethodInvoker OneEvent
{
add
{
}
remove
{
}
}
其中MethodInvoker
是一个没有参数和返回值的委托,它只是用来约束事件处理程序的的形式,你可以任意定义一个,例如你可以使用Action来代替。private MethodInvoker OneEvnet;
该字段的类型为委托的类型,字段名跟事件名相同(一个类中拥有同名成员,C#编译器是不允许的,但是系统可以)。
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();
}
可以看到,只有pr.OnCall和Pro.OnCalls订阅成功了,并且Pro.OnCalls不能被取消。 private void button1_Click(object sender, EventArgs e)
{
PropertyInfo pi= typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
EventHandlerList ehl = pi.GetValue(button2, null) as EventHandlerList;
FieldInfo fi = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static);
object key=fi.GetValue(null);
Delegate del= ehl[key];
foreach (Delegate de in del.GetInvocationList())
{
Console.WriteLine(de.Method.Name);//订阅的事件
ehl.RemoveHandler(key, de);//取消订阅
}
}
这段代码可以显示button2的Click事件订阅的所有方法,并且在执行该段代码后,button2的Click事件将失效。
[DefaultEvent("Click")]
class Control
{
}
TypeDescriptor.GetDefaultEvent。
Attribute attr= Attribute.GetCustomAttribute(typeof(TreeView),typeof(DefaultEventAttribute));
DefaultEventAttribute de = attr as DefaultEventAttribute;
MessageBox.Show(de.Name);