كيفية تمرير القيمة عند الاشتراك في الحدث والحصول عليها عندما يتم تشغيل الحدث (مشاكل استخدام DynamicMethod)
-
25-09-2019 - |
سؤال
المهمة هي إنشاء معالجات الأحداث في وقت التشغيل. أحتاج إلى استدعاء طريقة واحدة مع قيمة معلمة مختلفة للأحداث المختلفة. الأحداث وعددها معروف فقط في وقت التشغيل. لذلك أحاول توليد طرق ديناميكية ، سيتم تعيين كل منها في بعض الأحداث ، لكن بشكل عام ، يمررون جميعًا بعض القيمة إلى طريقة مثيل ويطلقون عليها.
سيكون من الرائع أن يتم القيام بشيء مماثل بطريقة أسهل. أعني تمرير بعض القيمة في مرحلة الاشتراك ثم الحصول عليها عند تشغيل الحدث.
هذا ما أحاول فعله الآن:
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 كمعالجات الأحداث ؛)
لا تنتمي إلى StackOverflow