(DynamicMethodの使用量の問題)イベントに加入する際に値を渡すと、イベントがトリガされたときに、それを入手する方法

StackOverflow https://stackoverflow.com/questions/2801997

質問

タスクは、実行時にイベントハンドラを作成することです。私は、さまざまなイベントのために異なるパラメータ値と呼ばれる1つの方法を必要としています。イベントとその数は、実行時に知られています。私は、動的メソッド、それぞれがいくつかのイベントに割り当てられますが、一般的に、彼らはすべてちょうどインスタンスメソッドにいくつかの値を渡すと、それを呼び出すを生成しようとしているので。

似た何かが簡単な方法を行うことができる場合は、

それは素晴らしいことです。私は、ステージをサブスクライブして、イベントがトリガされたときに、それを得ることを、いくつかの値を渡すことを意味します。

これは私が今やろうとしているものです。

public class EventSource
{
    public event EventHandler eventOne;
    public event EventHandler eventTwO;
    public event EventHandler eventThree;
}

public class EventListener
{
    SubscribeForEvents()
    {
        BindingFlags flags =
                    BindingFlags.IgnoreCase |
                    BindingFlags.Public |
                    BindingFlags.Instance;

        // Suppose we've already got EventInfo
        // and target source somewhere
        // so we can do eventInfo.AddEventHandler(target, delegate)
        // Now we need a delegate.

        int value = 42;
        Type tDelegate = eventInfo.EventHandlerType;

        // http://msdn.microsoft.com/en-us/library/ms228976(VS.95).aspx
        Type returnType = GetDelegateReturnType(tDelegate);
        DynamicMethod listener = new DynamicMethod("", null,
            GetDelegateParameterTypes(tDelegate), this.GetType());
        /////////

        Type[] callParameters = { typeof(int) };
        MethodInfo method = this.GetType().GetMethod("ToCallFromDelegate", flags);
        ILGenerator generator = listener.GetILGenerator();

        // No success in this mess. What's wrong?
        generator.Emit(OpCodes.Ldc_I4, value);
        generator.Emit(OpCodes.Call, method);
        generator.Emit(OpCodes.Pop);
        generator.Emit(OpCodes.Ret);
        /////////////

        Delegate delegate = listener.CreateDelegate(tDelegate);
        eventInfo.AddEventHandler(target, delegate);

        // When triggered, there is InvalidProgramException
    }

    void ToCallFromDelegate(int value)
    {
        doSomething();
    }
}
役に立ちましたか?

解決

ラムダイベントハンドラとして;)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top