读书人

关于C#事件解决方案

发布时间: 2012-09-20 09:36:50 作者: rapoo

关于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分可用分
[解决办法]

探讨

23楼的用法。

我使用
FieldInfo fi = typeof(A).GetField("ChangeName",BindingFlags.NonPublic | BindingFlags.Instance);

fi总是为null呀

读书人网 >C#

热点推荐