Having this type-independent method:
public static FieldInfo GetEventField(this Type type, string eventName)
{
FieldInfo field = null;
while (type != null)
{
/* Find events defined as field */
field = type.GetField(eventName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
if (field != null && (field.FieldType == typeof(MulticastDelegate) || field.FieldType.IsSubclassOf(typeof(MulticastDelegate))))
break;
/* Find events defined as property { add; remove; } */
field = type.GetField("EVENT_" + eventName.ToUpper(), BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
if (field != null)
break;
type = type.BaseType;
}
return field;
}
You can remove event handlers like this:
static void Main(string[] args)
{
ObservableCollection<string> obj = new ObservableCollection<string>();
obj.CollectionChanged += (sender, e) => { Console.WriteLine("Changed1"); };
obj.CollectionChanged += (sender, e) => { Console.WriteLine("Changed2"); };
obj.Add("value1"); //Changed1, Changed2 raised
var fi = obj.GetType().GetEventField("CollectionChanged");
if (fi == null) return;
fi.SetValue(obj, null); //remove all event handlers
obj.Add("value3"); //Nothing raised
}
As you see you could find this here