كيفية تمرير القيمة عند الاشتراك في الحدث والحصول عليها عندما يتم تشغيل الحدث (مشاكل استخدام DynamicMethod)

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

سؤال

المهمة هي إنشاء معالجات الأحداث في وقت التشغيل. أحتاج إلى استدعاء طريقة واحدة مع قيمة معلمة مختلفة للأحداث المختلفة. الأحداث وعددها معروف فقط في وقت التشغيل. لذلك أحاول توليد طرق ديناميكية ، سيتم تعيين كل منها في بعض الأحداث ، لكن بشكل عام ، يمررون جميعًا بعض القيمة إلى طريقة مثيل ويطلقون عليها.

سيكون من الرائع أن يتم القيام بشيء مماثل بطريقة أسهل. أعني تمرير بعض القيمة في مرحلة الاشتراك ثم الحصول عليها عند تشغيل الحدث.

هذا ما أحاول فعله الآن:

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();
    }
}
هل كانت مفيدة؟

المحلول

Lambdas كمعالجات الأحداث ؛)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top