Wie Wert zu übergeben, wenn sie Ereignis abonnieren und erhalten, wenn das Ereignis ausgelöst wird (Dynamicnutzungsprobleme)

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

Frage

Die Aufgabe ist es, Event-Handler in der Laufzeit zu erstellen. Ich brauche die ein Verfahren mit anderem Parameterwert für verschiedene Ereignisse aufgerufen werden. Die Ereignisse und ihre Zahl nur in Laufzeit bekannt. Also ich versuche, dynamische Methoden zu erzeugen, von denen jeder zu einem Ereignis zugeordnet werden, aber im Allgemeinen sie alle nur einen gewissen Wert auf eine Instanz-Methode übergeben und es nennen.

Es wäre toll, wenn etwas ähnliches, die einfache Art und Weise getan werden könnte. Ich meine einen Wert vorbei in der ersten Stufe der Zeichnung und den Erhalt es dann, wenn das Ereignis ausgelöst wird.

Das ist, was ich versuche jetzt zu tun:

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();
    }
}
War es hilfreich?

Lösung

Lambdas als Event-Handler;)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top