Come passare il valore al momento della sottoscrizione evento e di ottenere quando viene attivato l'evento (problemi di utilizzo DynamicMethod)
-
25-09-2019 - |
Domanda
Il compito è quello di creare gestori di eventi in fase di esecuzione. Ho bisogno di un metodo di essere chiamato con diversi valore di parametro per i diversi eventi. Gli eventi e il loro numero sono noti solo in fase di esecuzione. Così sto cercando di generare metodi dinamici, ognuno dei quali sarà assegnato a qualche evento, ma in generale tutti hanno semplicemente passare un po 'di valore a un metodo di istanza e chiamarlo.
Sarebbe bello se qualcosa di simile potrebbe essere fatto nel modo più semplice. Voglio dire passare un po 'di valore a sottoscrizione palco e poi ottenere quando viene attivato l'evento.
Questo è quello che sto cercando di fare ora:
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();
}
}
Soluzione
Lambda come gestori di eventi;)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow