Cómo usar Observable.FromEvent en lugar de FromEventPattern y evitar cadenas de nombres de eventos literales

Estoy aprendiendo a manejar Rx dentro de WinForms, y tengo el siguiente 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));
});

Esto funciona / funciona perfectamente, transmite en los eventos de KeyPress, se agrupa por la tecla presionada, y luego mantiene un registro de cuántas veces se presionó cada tecla y llama a unUpdateKeyPressStats Método con la tecla y nuevo número de prensas. ¡Envíalo!

Sin embargo, no soy un fan de laFromEventPattern firma, debido a la cadena de referencia literal al evento. Entonces, pensé que lo intentaríaFromEvent en lugar.

// 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));
});

Por lo tanto, el único cambio fue el intercambioObservable.FromEventPattern conObservable.FromEvent (y el camino en elSelect Consulta LINQ para obtener elKeyChar). El resto, incluyendo elSubscribe Los métodos son idénticos. Sin embargo, en el tiempo de ejecución con la segunda solución obtengo:

Se produjo una excepción no controlada del tipo 'System.ArgumentException' en mscorlib.dll

Información adicional: No se puede enlazar con el método de destino porque su firma o transparencia de seguridad no es compatible con la del tipo de delegado.

¿Qué está causando esta excepción de tiempo de ejecución y cómo debo evitarla?

GUI: WinFormsVersión de Rx y Rx-WinForms: 2.1.30214.0 (a través de Nuget)Marco de destino: 4.5

Respuestas a la pregunta(1)

Su respuesta a la pregunta