gpt4 book ai didi

c# - 与委托(delegate)具有多个参数且没有 EventArgs 的事件集成

转载 作者:太空宇宙 更新时间:2023-11-03 21:09:19 24 4
gpt4 key购买 nike

FromEvent 似乎没有过载或 FromEventPattern将转换为 IObservable<T> 的方法类型为 TDelegate 的事件仅在有多个参数且没有 EventArgs 的情况下.

例如看来我们无法将以下内容转换为可观察对象。

public event Action<int, int> SomethingHappened;

public event Func<string, int> SomethingElseHappened;

我们必须一个EventArgs在某处或有一个TDelegate在其签名中只有一个参数。所以,以下是可转换的,因为它们有一个 EventArgs在他们的隐式委托(delegate)中。

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


public delegate void NameChangedHandler(
object sender,
NameChangedEventArgs e);

而且这个也可以转换,因为它只有一个T。在其参数中。

public event Action<Tuple<string, string>> ClassChanged;

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

public event Action<T1, T2...> ItHappened;

最佳答案

使用类测试器

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

你可以使用这个签名 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);

关于该重载有一个很好的引用 here .

关于c# - 与委托(delegate)具有多个参数且没有 EventArgs 的事件集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38739391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com