- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
?-6ren"> ?-这就是我的意思。假设我正在使用公开事件的 API,但这些事件不遵循标准 EventHandler或EventHandler签名。例如,一个事件可能如下所示: Public Event Update(B-6ren">
这就是我的意思。假设我正在使用公开事件的 API,但这些事件不遵循标准 EventHandler
或EventHandler<TEventArgs>
签名。例如,一个事件可能如下所示:
Public Event Update(ByVal sender As BaseSubscription, ByVal e As BaseEvent)
现在,通常情况下,如果我想获得 IObservable<TEventArgs>
从一个事件中,我可以这样做:
Dim updates = Observable.FromEvent(Of UpdateEventArgs)( _
target:=updateSource, _
eventName:="Update" _
)
但这不起作用,因为 Update
事件不是EventHandler<UpdateEventArgs>
-- 事实上,没有 UpdateEventArgs
——它基本上就是它自己的东西。
显然,我可以定义我自己的类,派生自 EventArgs
(即 UpdateEventArgs
),编写另一个类来包装提供 Update
的对象事件,为包装类提供其自己的 Update
事件是 EventHandler<UpdateEventArgs>
,并获得 IObservable<UpdateEventArgs>
来自那个。但这是一项烦人的工作量。
有没有办法创建 IObservable<[something]>
来自这样的“非标准”事件,还是我运气不好?
更新:从 Jon Skeet 的回答中,我被推向了以下重载的方向 Observable.FromEvent
:
Function FromEvent(Of TDelegate, TEventArgs As EventArgs)( _
conversion As Func(Of EventHandler(Of TEventArgs), TDelegate), _
addHandler As Action(Of TDelegate), _
removeHandler As Action(Of TDelegate) _
) As IObservable(Of IEvent(Of TEventArgs))
不过,我必须承认,我很难理解这一点 Func(Of EventHandler(Of TEventArgs), TDelegate)
部分。对我来说这似乎是倒退的(?)。显然,我缺少一些东西......
无论如何,如果它有帮助,我认为这就是等效的 C# 代码的样子(我会非常诚实:我对此不确定。尽管我通常更喜欢我本人使用 C#,此代码是我的一位同事的作品,他主要使用 VB.NET 编写;VB.NET 允许使用多种语法来声明事件):
// notice: not an EventHandler<TEventArgs>
public delegate void UpdateEventHandler(BaseSubscription sender, BaseEvent e);
// not 100% sure why he did it this way
public event UpdateEventHandler Update;
这里棘手的部分是,似乎某种类派生自 EventArgs
无论如何,这是必要的。在我正在使用的 API 中,没有这样的类。所以,至少,我必须写一篇。但这应该是相当微不足道的(基本上是一个属性: BaseEvent
)。
最后,我假设此重载所需的代码在 C# 中如下所示:
var updates = Observable.FromEvent<UpdateEventHandler, UpdateEventArgs>(
// conversion (Func<EventHandler<UpdateEventArgs>, UpdateEventHandler>)
handler => (sender, e) => handler(sender, new UpdateEventArgs(e)),
// addHandler (Action<UpdateEventHandler>)
handler => updateSource.Update += handler,
// removeHandler (Action<UpdateEventHandler>)
handler => updateSource.Update -= handler
);
首先:我能说清楚吗?其次:我是否正确地说,使用 VB 9,如果不编写自己的方法,确实无法完成上述任务?
我几乎感觉自己一开始就从完全错误的角度来处理这个问题。但我真的不确定。
最佳答案
也许您可以为自定义事件签名添加您自己的实现?
public interface ICustomEvent<TSource, TArgs>
{
public TSource Source { get; }
public TArgs EventArgs { get; }
}
public interface CustomEvent<TSource, TArgs> : ICustomEvent<TSource, TArgs>
{
public TSource Source { get; set; }
public TArgs EventArgs { get; set; }
}
public static class ObservableEx
{
public static IObservable<ICustomEvent<TSource, TArgs>> FromCustomEvent(
Action<Action<TSource, TArgs>> addHandler,
Action<Action<TSource, TArgs>> removeHandler)
{
return Observable.CreateWithDisposable(observer =>
{
Action<TSource, TArgs> eventHandler = (s,a) =>
observer.OnNext(new CustomEvent<TSource,TArgs>(s,a));
addHandler(eventHandler);
return Disposable.Create(() => removeHandler(eventHandler));
});
}
}
然后您可以将其用作:
var observable = ObservableEx.FromCustomEvent<BaseSubscription,BaseEvent>(
h => updateSource.Update += h,
h => updateSource.Update -= h
);
关于.net - 如何从 "non-standard"事件中获取 Rx 中的 IObservable<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2915051/
我对这个错误很困惑: Cannot implicitly convert type 'System.Func [c:\Program Files (x86)\Reference Assemblies\
考虑这段代码: pub trait Hello { fn hello(&self); } impl Hello for Any { fn hello(&self) {
问题很简单。是否可以构造这样一个类型 T,对于它下面的两个变量声明会产生不同的结果? T t1 = {}; T t2{}; 我已经研究 cppreference 和标准一个多小时了,我了解以下内容:
Intellij idea 给我这个错误:“Compare (T, T) in Comparator cannot be applied to (T, T)” 对于以下代码: public class
任何人都可以告诉我 : n\t\t\t\t\n\t\t\t 在以下来自和 dwr 服务的响应中的含义和用途是什么. \r\n\t\t\t \r\n\t\t\t
让 T 成为一个 C++ 类。 下面三个指令在行为上有什么区别吗? T a; T a(); T a = T(); T 为不带参数的构造函数提供了显式定义这一事实是否对问题有任何改变? 后续问题:如果
Rust中的智能指针是什么 智能指针(smart pointers)是一类数据结构,是拥有数据所有权和额外功能的指针。是指针的进一步发展 指针(pointer)是一个包含内存地
比如我有一个 vector vector > v={{true,1},{true,2},{false,3},{false,4},{false,5},{true,6},{false,7},{true,8
我有一个来自 .xls 电子表格的数据框,我打印了 print(df.columns.values) 列,输出包含一个名为:Poll Responses\n\t\t\t\t\t。 我查看了 Excel
This question already has answers here: What are good reasons for choosing invariance in an API like
指针类型作为类型前缀与在类型前加斜杠作为后缀有什么区别。斜线到底是什么意思? 最佳答案 语法 T/~ 和 T/& 基本上已被弃用(我什至不确定编译器是否仍然接受它)。在向新向量方案过渡的初始阶段,[T
我正在尝试找到一种方法来获取模板参数的基类。 考虑以下类: template class Foo { public: Foo(){}; ~Foo(){};
这是一个让我感到困惑的小问题。我不知道如何描述它,所以只看下面的代码: struct B { B() {} B(B&) { std::cout ::value #include
为什么有 T::T(T&) 而 T::T(const T&) 更适合 copy ? (大概是用来实现move语义的???) 原始描述(被melpomene证明是错误的): 在C++11中,支持了一种新
在 Java 7 中使用 eclipse 4.2 并尝试实现 List 接口(interface)的以下方法时,我收到了警告。 public T[] toArray(T[] a) { ret
假设有三个函数: def foo[T](a:T, b:T): T = a def test1 = foo(1, "2") def test2 = foo(List(), ListBuffer()) 虽
我对柯里化(Currying)和非柯里化(Currying)泛型函数之间类型检查的差异有点困惑: scala> def x[T](a: T, b: T) = (a == b) x: [T](a: T,
考虑一个类A,我如何编写一个具有与相同行为的模板 A& pretty(A& x) { /* make x pretty */ return x; } A pretty(A&& x) {
Eclipse 表示由于泛型类型橡皮擦,类型参数不允许使用 instanceof 操作。 我同意在运行时不会保留任何类型信息。但是请考虑以下类的通用声明: class SomeClass{ T
在 C++14 中: 对于任何整数或枚举类型 T 以及对于任何表达式 expr: 有没有区别: struct S { T t { expr }; }; 和 struct S { T t = { exp
我是一名优秀的程序员,十分优秀!