2016-07-05 13 views
0

Ich habe eine eventhanler:Parameter weniger Delegat in Reactive Extensions in einem Universal-C# Windows-App

public delegate void OnSizeEventHandler(); 

Und ich habe die Klasse, die das Ereignis dieser Art löst

CustomObject.OnSize += OnResize; 

Wie Sie sehen können es ist nur ein parameterloser Delegierter.

ich es von reaktiven Erweiterungen verwenden möchten wie:

var eventAsObservable = Observable.FromEvent<OnSizeEventHandler>(   
     x => CustomObject.OnSize += x, 
     x => CustomObject.OnSize -= x); 

bekomme ich diesen Fehler:

Error CS0029 Cannot implicitly convert type 'System.Action<CustomObject.OnSizeEventHandler>' to 'CustomObject.OnSizeEventHandler' 

Was mache ich falsch? Es funktioniert ziemlich gut mit EventHandlers, aber wenn es um ein benutzerdefiniertes Ereignis geht, ist es so schwer herauszufinden, wie es funktioniert.

Danke.

Antwort

1

die Antwort gefunden, es ist nur recht schwierig zu einem parameterlos Ereignisse zuordnen, aber es funktioniert:

Convert event without EventArgs using Observable.FromEvent

var opened = Observable.FromEvent<_dispSolutionEvents_OpenedEventHandler, Unit>(
h =>() => h(Unit.Default), 
h => _SolutionEvents.Opened += h, 
h => _SolutionEvents.Opened -= h); 

I RX likw würde einfacher zu sein oder eine Überlastung des einschließen FromEvent, wenn es möglich ist.

1

Wenn Sie sich die Überladungen von FromEvent ansehen, werden Sie sehen, dass es keine gibt, die Ihrem aktuellen Anruf entsprechen.

Vielleicht möchten Sie stattdessen verwenden, dies versuchen:

var eventAsObservable = Observable.FromEvent<OnSizeEventHandler>(   
    (Action x) => CustomObject.OnSize += new OnSizeEventHandler(x), 
    (Action x) => CustomObject.OnSize -= new OnSizeEventHandler(x)); 

Grundsätzlich dass die Rx Unterstützung für Action -basierte Ereignisse zu nehmen ist versucht, und wickeln Sie die Aktion, die in einem OnSizeEventHandler jedes Mal übergeben wird.

Ich möchte nicht garantieren, dass es funktioniert, aber es ist einen Versuch wert.

+0

Hallo Jon, danke für die Antwort, ich verwende diese Konvention, wann immer ich kann, aber dieser Delegat stammt aus einer Bibliothek, die ich nicht modifizieren kann. Die Antwort, die Sie vorschlagen, wirft, obwohl es kompiliert wird, eine Ausnahme aus: Zusätzliche Information: Kann nicht an die Zielmethode binden, weil ihre Signatur oder Sicherheitstransparenz nicht mit der des Delegattyps kompatibel ist. Es erwartet einen Delegaten mit einem Parameter und mein Delegat ist parameterlos. – toroveneno

+0

@FernandoUrkijoCereceda: Es wäre nützlich zu sagen, dass der Delegierte nicht in Ihrer Kontrolle ist. Schande über die Ausnahme - wird bearbeitet. –