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