ここでの私の質問のフォローアップとして、実行時にパラメーターが決定される匿名のイベントハンドラーを作成しようとしています。
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());
}
}
ラムダ式とデリゲートに関する知識が不足しているため、この問題を解決できません...
匿名ハンドラーは、送信者オブジェクト、イベント引数、およびコマンドオブジェクトを別の関数に転送するだけです。すべてのイベントが同じ引数を持っているわけではないので、ハンドラーを動的引数を持つ無名関数として定義することを考えました。
しかし、私の問題に取り組む可能性のある他の解決策は大歓迎です。