Verwendung von Observable.FromEvent anstelle von FromEventPattern und Vermeidung von Zeichenfolgenliteral-Ereignisnamen

Ich lerne mich in WinForms in Rx zurecht und habe folgenden Code:

// Create an observable from key presses, grouped by the key pressed
var groupedKeyPresses = Observable.FromEventPattern<KeyPressEventArgs>(this, "KeyPress")
                                  .Select(k => k.EventArgs.KeyChar)
                                  .GroupBy(k => k);

// Increment key counter and update user's display
groupedKeyPresses.Subscribe(keyPressGroup =>
{
    var numPresses = 0;
    keyPressGroup.Subscribe(key => UpdateKeyPressStats(key, ++numPresses));
});

Dies funktioniert / läuft einwandfrei, überträgt die KeyPress-Ereignisse, gruppiert nach gedrückter Taste und protokolliert dann, wie oft jede Taste gedrückt wurde und ruft eine aufUpdateKeyPressStats Methode mit der Taste und neuer Anzahl von Drücken. Es versenden!

Ich bin jedoch kein Fan vonFromEventPattern Signatur aufgrund des String-Literal-Verweises auf das Ereignis. Also dachte ich, ich würde es versuchenFromEvent stattdessen.

// Create an observable from key presses, grouped by the key pressed
var groupedKeyPresses = Observable.FromEvent<KeyPressEventHandler, KeyPressEventArgs>(h => this.KeyPress += h, h => this.KeyPress -= h)
                                  .Select(k => k.KeyChar)
                                  .GroupBy(k => k);

// Increment key counter and update user's display
groupedKeyPresses.Subscribe(keyPressGroup =>
{
    var numPresses = 0;
    keyPressGroup.Subscribe(key => UpdateKeyPressStats(key, ++numPresses));
});

Die einzige Veränderung war also, auszutauschenObservable.FromEventPattern mitObservable.FromEvent (und der Pfad in derSelect LINQ-Abfrage zum Abrufen derKeyChar). Der Rest, einschließlich derSubscribe Methoden sind identisch. Zur Laufzeit mit der zweiten Lösung erhalte ich jedoch:

In mscorlib.dll ist eine nicht behandelte Ausnahme vom Typ "System.ArgumentException" aufgetreten

Zusätzliche Informationen: Es kann keine Bindung an die Zielmethode hergestellt werden, da ihre Signatur oder Sicherheitstransparenz nicht mit der des Delegattyps kompatibel ist.

Was ist die Ursache für diese Laufzeitausnahme und wie kann ich sie vermeiden?

GUI: WinFormsRx & Rx-WinForms Version: 2.1.30214.0 (über Nuget)Zielrahmen: 4.5

Antworten auf die Frage(1)

Ihre Antwort auf die Frage