gpt4 book ai didi

c# - Observable.FromEventPattern(addHandler, removeHandler) - 简化?

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

从事件创建可观察对象时,看起来以下是最常见的方式:

var o = Observable.FromEventPattern(h => source.Event += h,
h => source.Event -= h);

我发现这种形式在某些情况下有点乏味,因为我想以相同的方式处理多个事件。但这看起来并不容易,因为事件本身似乎无法参数化,如这段非编译代码所示:

private IObservable MakeAnObservableFromThisEvent(Event event)
{
return Observable.FromEventPattern(h => event += h,
h => event -= h);

}

private void MakeAlotOfObservables(object source)
{
MakeAnObservableFromThisEvent(source.OneEvent);
MakeAnObservableFromThisEvent(source.AnotherEvent);
MakeAnObservableFromThisEvent(source.ThirdEvent);

//or even
MakeAnObservableFromThisEvent(() => source.ThirdEvent);
}

当然有“事件名称”-overload:

var o = Observable.FromEventPattern< >(source, "Event");

但是这个东西或多或少带有魔法字符串......

有没有办法优化这段代码?还是事情就是这样?

最佳答案

问题是事件处理程序具有“值类型”语义(如字符串),因此将它们作为参数传递只有在您打算调用它们时才有用。添加新的处理程序有效地创建了一个新的委托(delegate)实例,并且原始实例没有被修改。

然后唯一真正可行的方法是使用您在问题中首先显示的语法来添加和删除处理程序并同时维护类型安全。

var o =
Observable
.FromEventPattern(
h => source.Event += h,
h => source.Event -= h);

但是,还有另一种我已经使用了很多的选项——那就是使用扩展方法。

如果我有这个类:

public class Foo
{
public event EventHandler<EventArgs> Click;
}

我可以写一个扩展方法:

public static class FooEx
{
public static IObservable<EventPattern<EventArgs>> Clicks(this Foo source)
{
return
Observable
.FromEventPattern<EventArgs>(
h => source.Click += h,
h => source.Click -= h);
}
}

然后我可以这样写:

var foo = new Foo();
foo.Clicks().Subscribe(x => Console.WriteLine("Click!"));

您可以有效地为每个类型和事件编写一次扩展方法,然后可以在任何需要的地方使用它,并且语法有了很大改进。

关于c# - Observable.FromEventPattern(addHandler, removeHandler) - 简化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27390347/

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