- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
从事件创建可观察对象时,看起来以下是最常见的方式:
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/
我在很多答案中都看到了这一点,但我无法弄清楚它是如何工作的。 它通常是这样的(伪代码): UIElement.AddHandler(routedEvent, new EventHandler(hand
如何将 RemoveHandler 与匿名方法一起使用? 这是我为 MyClass 类的 MyEvent 事件添加处理程序的方法: AddHandler MyClass.MyEvent, Sub()
在开发过程中,我使用 python 日志记录模块。例如,在出现未处理的异常后,我想重新运行程序并重新初始化日志记录。由于某种原因,我似乎无法从日志实例中删除所有处理程序。尽管如此,它从未被删除。 im
我正在使用 WeakEventManager 类以订阅 C# 中的事件。事件订阅工作正常,但是调用 WeakEventManager.RemoveHandler 来自Task并不总是删除处理程序 -
我想在第一次收到事件时删除 GWT 事件处理程序。我还想避免因跟踪并非真正必要的注册对象而污染我的类(class)。我目前将其编码为: final HandlerRegistration[] regi
使用AddHandler方法,如果我从不使用RemoveHandler,在某些条件和情况下会导致内存泄漏吗?我不太确定这件事的真实性。 还有其他导致内存泄漏的原因吗?这些原因仅在 VB 中存在,而在
从事件创建可观察对象时,看起来以下是最常见的方式: var o = Observable.FromEventPattern(h => source.Event += h,
我正在追踪某些应用程序中的内存泄漏。许多表单共享相同的 Spellchecker 对象,因此任何单独的表单都无法生存。我知道如果没有正确删除处理程序事件,这可能会导致内存泄漏。 AddHandler
注意!!! 您在发布的代码中看到的 for-each 迭代器不会抛出此异常!!! 我在我的 Android 应用程序中遇到了一个非常奇怪的 ConcurrentModificationExceptio
我正在尝试调试别人的 Python 代码中的异常,但我不是 Python 专家。该代码尝试刷新并删除标准 Python 记录器上的所有处理程序: def restart_logging(logger_
我是一名优秀的程序员,十分优秀!