与委托有多个参数且没有 EventArgs 的事件集成

Wat*_* v2 3 c# system.reactive

似乎没有FromEvent或方法的重载,仅在有多个参数且没有 的情况下FromEventPattern才会转换为具有该IObservable<T>类型的事件。TDelegateEventArgs

例如,我们似乎无法将以下内容转换为可观察量。

public event Action<int, int> SomethingHappened;

public event Func<string, int> SomethingElseHappened;
Run Code Online (Sandbox Code Playgroud)

我们要么必须EventArgs在某个地方有一个,要么TDelegate在其签名中只有一个参数。因此,以下内容是可转换的,因为它们有一个EventArgs隐式委托。

public event NameChangedHandler NameChanged;
public event EventHandler RollNumberChanged;
public event EventHandler<AgeChangedEventArgs> AgeChanged;


public delegate void NameChangedHandler(
                     object sender, 
                     NameChangedEventArgs e);
Run Code Online (Sandbox Code Playgroud)

这个也可以转换,因为T它的参数只有一个。

public event Action<Tuple<string, string>> ClassChanged;
Run Code Online (Sandbox Code Playgroud)

如果我遇到这样的事件我该怎么办:

public event Action<T1, T2...> ItHappened;
Run Code Online (Sandbox Code Playgroud)

Shl*_*omo 5

使用类测试器

public class Tester
{
    public void FireEvent(int i1, int i2, int i3)
    {
        if(ItHappened != null)
            ItHappened(i1, i2, i3);
    }

    public event Action<int, int, int> ItHappened;
}
Run Code Online (Sandbox Code Playgroud)

您可以将此签名Observable.FromEvent<TDelegate, TEventArgs> (Func<Action<TEventArgs>, TDelegate>, Action<TDelegate>, Action<TDelegate>)与转换函数一起使用,如下所示:

var t3 = new Tester();
IObservable<Tuple<int, int, int>> observable = Observable.FromEvent<Action<int, int, int>, Tuple<int, int, int>>(
    onNextHandler => (int i1, int i2, int i3) => onNextHandler(Tuple.Create(i1, i2, i3)),
    h => t3.ItHappened += h,
    h => t3.ItHappened -= h);

using (var disposable = observable.Subscribe(t => Console.WriteLine($"{{{t.Item1}, {t.Item2}, {t.Item3}}}")))
{
    t3.FireEvent(1, 2, 3);
}
t3.FireEvent(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

这里有关于重载的很好的参考。