作为我的问题的后续,我正在尝试创建一个匿名事件处理程序,其参数是在运行时决定的。
private void RegisterEventHandlers(Control ctl)
{
foreach (Command command in CommandList)
{
EventInfo eventInfo = ctl.GetType().GetEvent(command.Name);
List<ParameterExpression> callArguments = new List<ParameterExpression>();
foreach (ParameterInfo parameter in eventInfo.EventHandlerType.GetMethod("Invoke").GetParameters())
{
callArguments.Add(Expression.Parameter(parameter.ParameterType, parameter.Name));
}
//begin pseudo code
method = (callArguments) =>
{
if (sender != null) ...
if (e != null) ...
name = command.name;
};
or
method = new delegate
{
if (sender != null) ...
if (e != null) ...
name = command.name;
};
//end pseudo code
var body = Expression.Call(Expression.Constant(this), method, callArguments);
var lambda = Expression.Lambda(eventInfo.EventHandlerType, body, callArguments);
eventInfo.AddEventHandler(ctl, lambda.Compile());
}
}
我发现我对 lambda 表达式和委托的知识太缺乏解决这个问题......
匿名处理程序只需将发送者对象、事件参数和命令对象转发给另一个函数。并非所有事件都具有相同的参数,因此我想到将处理程序定义为具有动态参数的匿名函数。
但是,非常欢迎其他可能解决我的问题的解决方案。