【问题标题】:How to pass value when subscribing to event and obtain it when the event is triggered (DynamicMethod usage problems)订阅事件时如何传值,事件触发时获取(DynamicMethod使用问题)
【发布时间】:2010-05-10 10:47:17
【问题描述】:

任务是在运行时创建事件处理程序。对于不同的事件,我需要使用不同的参数值调用一种方法。事件及其编号仅在运行时已知。所以我正在尝试生成动态方法,每个方法都会分配给某个事件,但通常它们都只是将一些值传递给实例方法并调用它。

如果能以更简单的方式完成类似的事情,那就太好了。我的意思是在订阅阶段传递一些值,然后在事件触发时获取它。

这就是我现在要做的:

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();
    }
}

【问题讨论】:

    标签: .net events intermediate-language dynamicmethod


    【解决方案1】:

    Lambdas 作为事件处理程序 ;)

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多