/// <summary>
/// 移除一个对象指定事件的所有注册的方法
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="obj">当前对象</param>
/// <param name="eventName">事件名</param>
public static void RemoveEvent<T>(T obj, string eventName)
{
BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static;
EventInfo[] eventInfo = obj.GetType().GetEvents(bindingFlags);
if (eventInfo == null)
{
return;
}
foreach (EventInfo info in eventInfo)
{
if (string.Compare(info.Name, eventName, StringComparison.OrdinalIgnoreCase) == 0)
{
FieldInfo fieldInfo = info.DeclaringType.GetField(info.Name, bindingFlags);
if (fieldInfo != null)
{
fieldInfo.SetValue(obj, null);
}
break;
}
}
}
测试代码;
PubFunction.RemoveEvent<BetchSettingValueForm>(this, "BeforeDictEntry");
//特殊帮助类型帮助前过滤扩展
MethodInfo method = valExtend.GetType().GetMethod(field.Element.LabelID + "_Extend");
if (method != null)
{
valExtend.gspState = GspState;
valExtend.dsMXJH = MXJH;
//转化method到delegate
Delegate methodDel = PubFunction.CreateDelegateFromMethodInfo<BeforeDictEntryEventArgs<SmartHelpInfo>>(valExtend, method);
//先移除事件再注册
BeforeDictEntry += methodDel as EventHandler<BeforeDictEntryEventArgs<SmartHelpInfo>>;
}
#endregion
//值改变事件注册,完成批量设置
PubFunction.RemoveEvent<ButtonEdit>(helpEdit, "ButtonClick");
helpEdit.ButtonClick += helpEdit_ButtonClick;