Como usar Observable.FromEvent em vez de FromEventPattern e evitar nomes de eventos literais de string
Estou aprendendo sobre Rx dentro do WinForms e tenho o seguinte código:
// 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));
});
Isso funciona / corre perfeitamente, transmite os eventos KeyPress, agrupa a tecla pressionada e, em seguida, controla quantas vezes cada tecla foi pressionada e chama umUpdateKeyPressStats
método com a chave e novo número de impressoras. Enviá-lo!
No entanto, eu não sou fã doFromEventPattern
assinatura, devido à referência literal da string para o evento. Então, eu pensei em tentarFromEvent
em vez de.
// 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));
});
Então, a única mudança foi trocarObservable.FromEventPattern
comObservable.FromEvent
(e o caminho noSelect
Consulta LINQ para obter oKeyChar
). O resto, incluindo oSubscribe
métodos são idênticos. No entanto, em tempo de execução com a segunda solução, recebo:
Uma exceção sem tratamento do tipo 'System.ArgumentException' ocorreu em mscorlib.dll
Informações adicionais: Não é possível ligar ao método de destino porque sua assinatura ou transparência de segurança não é compatível com a do tipo delegado.
O que está causando essa exceção de tempo de execução e como devo evitá-lo?
GUI: WinFormsRx & Rx-WinForms Versão: 2.1.30214.0 (via Nuget)Estrutura de alvo: 4.5