关于C#事件
有没有办法获取当前类型的实例中已注册的的事件列表,并注销他们
例如:
自定义委托:
public delegate void ChangeProperty();
类:
public class A
{
// 自定义事件
public event ChangeProperty ChangeName;
protected virtual void OnChangeName()
{
if (ChangeName != null) ChangeName();
}
}
在程序运行的时候可能有些地方注册了ChangeName事件。
在某处,如何知道指定A类型的一个实例的ChangeName事件的注册事件列表,并注销它们?
[解决办法]
关注...
[解决办法]
- C# code
System.ComponentModel.EventHandlerList list= this.Events;
[解决办法]
- C# code
Delegate.RemoveAll(ChangeName);
[解决办法]
- C# code
System.Web.UI.WebControls.Label label = new System.Web.UI.WebControls.Label(); System.Reflection.EventInfo[] events= label.GetType().GetEvents();
[解决办法]
关注 帮顶~
[解决办法]
如果控制一个委托事件里同样的方法只注册一次?
与这个问题是类似的,GetInvocationList获取所有的事件处理函数:
- C# code
Delegate[] allDlg = new Delegate[this.UpdateFax.GetInvocationList().GetLength(0)];this.UpdateFax.GetInvocationList().CopyTo(allDlg, 0);foreach (Delegate dlg in allDlg){ if (dlg.Method.Name == "Form1_UpdateFax") { //不在绑定 } else { //绑定 UpdateFax += new UpdateFaxEventHander(Form1_UpdateFax); MessageBox.Show("绑定成功"); }}
[解决办法]
想到:循环委托列表,一一进行取消.
我去试下...
[解决办法]
- C# code
public delegate void ChangeProperty(); public class A { // 自定义事件 public event ChangeProperty ChangeName; public void Test() { OnChangeName(); } protected virtual void OnChangeName() { if (ChangeName != null) ChangeName(); } public void ReMove() { ChangeProperty temp = null; foreach (Delegate d in ChangeName.GetInvocationList()) { temp = (ChangeProperty)d; ChangeName -= temp; } } }
[解决办法]
获取委托列表,直接给列表清空或释放试试
[解决办法]
你自己需要维护一个监听器
http://book.51cto.com/art/200809/90512.htm
[解决办法]
路过,学习下
[解决办法]
路过看看
[解决办法]
发射法:
- C# code
//test code begin A a = new A(); a.ChangeName+=delegate(){ Console.WriteLine("ChangeName 1"); }; a.ChangeName+=delegate(){ Console.WriteLine("ChangeName 2"); }; a.ChangeName+=delegate(){ Console.WriteLine("ChangeName 3"); }; a.DoChangeName();//test code end FieldInfo fi = typeof(A).GetField("ChangeName",BindingFlags.NonPublic | BindingFlags.Instance); Delegate del = fi.GetValue(a) as Delegate; foreach (Delegate value in del.GetInvocationList()) { del = Delegate.Remove(del,value); } fi.SetValue(a, del); a.DoChangeName();
[解决办法]
写错了,反射法。
[解决办法]
每天回帖即可获得10分可用分
[解决办法]