class Program
{
static void Main(string[] args)
{
Customer c = new Customer();
EventInfo evt = c.GetType().GetEvent("OnChange",
BindingFlags.NonPublic | BindingFlags.Instance
| BindingFlags.Public
);
// 添加一个事件关联
evt.AddEventHandler(c, new EventHandler(c_OnChange));
// 添加第二个事件关联
evt.AddEventHandler(c, new EventHandler(c_OnChange));
// 删除全部事件关联。
RemoveEvent<Customer>(c, "OnChange");
c.Change();
}
static void c_OnChange(object sender, EventArgs e)
{
Console.WriteLine("事件被触发了");
}
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);
}
}
public static Delegate[] GetObjectEventList(object p_Object, string p_EventName)
{
// Get event field
FieldInfo _Field = p_Object.GetType().GetField(p_EventName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
if (_Field == null)
{
return null;
}
// get the value of event field which should be a delegate
object _FieldValue = _Field.GetValue(p_Object);
// if it is a delegate
if (_FieldValue != null && _FieldValue is Delegate)
{
// cast the value to a delegate
Delegate _ObjectDelegate = (Delegate)_FieldValue;
// get the invocation list
return _ObjectDelegate.GetInvocationList();
}
return null;
}
}
class Customer
{
public event EventHandler OnChange;
public void Change()
{
if (OnChange != null)
OnChange(this, null);
else
Console.WriteLine("no event attached");
}
}
转自:http://blog.csdn.net/diandian82/article/details/5738299