static void AddEventHandler(EventInfo eventInfo, object item, Action action)
{
var parameters = eventInfo.EventHandlerType
.GetMethod("Invoke")
.GetParameters()
.Select(parameter => Expression.Parameter(parameter.ParameterType))
.ToArray();
var handler = Expression.Lambda(
eventInfo.EventHandlerType,
Expression.Call(Expression.Constant(action), "Invoke", Type.EmptyTypes),
parameters
)
.Compile();
eventInfo.AddEventHandler(item, handler);
}
static void AddEventHandler(EventInfo eventInfo, object item, Action<object, EventArgs> action)
{
var parameters = eventInfo.EventHandlerType
.GetMethod("Invoke")
.GetParameters()
.Select(parameter => Expression.Parameter(parameter.ParameterType))
.ToArray();
var invoke = action.GetType().GetMethod("Invoke");
var handler = Expression.Lambda(
eventInfo.EventHandlerType,
Expression.Call(Expression.Constant(action), invoke, parameters[0], parameters[1]),
parameters
)
.Compile();
eventInfo.AddEventHandler(item, handler);
}
用法:
Action action =() => BM_21_Grad.LaunchMissle();
foreach (var eventInfo in form.GetType().GetEvents())
{
AddEventHandler(eventInfo, form, action);
}
+1發射導彈! – Jason 2012-03-17 20:18:29
如果用於該事件的委託類型具有非空的返回類型或「out」參數,那麼您會發生什麼情況? – 2012-03-17 20:27:42
@JonSkeet好點,我沒有真正考慮它;輸出參數和返回值對於事件並不真正有用。但我期望轉換錯誤,異常等。基本上我想假設這些類型不會被用作我自己理智的事件處理程序。 – Siege 2012-03-17 20:40:55