using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.ComponentModel;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
ProtocolEvent c = new ProtocolEvent();
c.OnChange += new ProtocolEvent.mydelegate(c_OnChange);
c.OnChange += new ProtocolEvent.mydelegate(c_OnChange2);
RemoveEvent<ProtocolEvent>(c, "OnChange");
c.OnChange += new ProtocolEvent.mydelegate(c_OnChange);
c.Change("ddd");
}
static void c_OnChange(string str)
{
Console.WriteLine(str);
}
static void c_OnChange2(string str)
{
Console.WriteLine(str);
}
static void RemoveEvent<T>(T c, string name)
{
Delegate[] invokeList = GetObjectEventList(c, name);
if (invokeList == null) return;
foreach (Delegate del in invokeList)
{
typeof(T).GetEvent(name).RemoveEventHandler(c, del);
}
}
/// <summary>
/// 说来很简单,GetType().GetField("事件名",BindingFlags.Instance | BindingFlags.NonPublic);
/// 然后调用GetValue就可以得到对应的委托了。既然有委托了。调用GetInvokeList就可以了。
public static Delegate[] GetObjectEventList(object p_Object, string p_EventName)
{
FieldInfo fi = p_Object.GetType().GetField("OnChange", BindingFlags.Instance | BindingFlags.NonPublic);
if (fi == null) return null;
Delegate del = fi.GetValue(p_Object) as Delegate;
if (del != null)
{
//执行方法
//foreach (var item in del.GetInvocationList())
//{
// Console.WriteLine(item.Method.ToString());
// item.Method.Invoke(null,new object[]{"str"});
//}
return del.GetInvocationList();
}
return null;
}
}
class ProtocolEvent
{
public delegate void mydelegate(string str);
public event mydelegate OnChange;
public void Change(string str)
{
if (OnChange != null)
{
OnChange(str);
}
}
}
}