Как использовать Observable.FromEvent вместо FromEventPattern и избегать строковых литералов имен событий
Я изучаю Rx в WinForms и имею следующий код:
// 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));
});
Это работает / работает отлично, потоки в событиях KeyPress, группирует по нажатой клавише, а затем отслеживает, сколько раз была нажата каждая клавиша, и вызываетUpdateKeyPressStats
метод с ключом и новым количеством нажатий. Отправим его!
Тем не менее, я не фанатFromEventPattern
подпись, из-за строковой литеральной ссылки на событие. Итак, я решил попробоватьFromEvent
вместо.
// 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));
});
Таким образом, единственное изменение было заменойObservable.FromEventPattern
с участиемObservable.FromEvent
(и путь вSelect
LINQ-запрос, чтобы получитьKeyChar
). Остальные, в том числеSubscribe
методы идентичны. Однако во время выполнения второго решения я получаю:
Необработанное исключение типа «System.ArgumentException» произошло в mscorlib.dll
Дополнительная информация: Невозможно выполнить привязку к целевому методу, поскольку его подпись или прозрачность безопасности не совместимы с сигнатурой типа делегата.
Что вызывает это исключение во время выполнения и как мне его избежать?
GUI: WinFormsRx & Rx-WinForms Версия: 2.1.30214.0 (через Nuget)Целевая структура: 4,5