- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在看
的实现Observable.FromEvent<TEventHandler, TEventHandlerArgs>(add, remove)
我正在努力了解它是如何工作的。让我们说 TEventHandler 是标准:
public delegate void EventHandler(object sender, EventArgs e);
那么让我费解的代码是:
TEventHandler d = (TEventHandler) Delegate.CreateDelegate(
typeof (TEventHandler),
(object) new Action<EventArgs>(observer.OnNext),
typeof (Action<EventArgs>).GetMethod("Invoke"));
(n.b 我已将此通用代码专门用于此特定示例实例。)
CreateDelegate 如何创建绑定(bind)到操作上签名 (args) 调用方法的签名委托(delegate) (obj, args)? obj 要去哪里?
这感觉有点像是有一个开放的代理人在行动,我们正在从 CreateDelegate 强制“this”成为“firstArguemnt”并允许 args 失败。如果这样感觉有点脏?
最佳答案
让我们分解一下:
首先,反编译Rx v2.0.3 似乎没有Observable.FromEvent<TEventHandler, TEventHandlerArgs>(add, remove)
方法,我碰巧身边的 Rx v 1.1 也没有。我假设您指的是我能找到的最接近的匹配项,即:
public static IObservable<TEventArgs> FromEvent<TDelegate, TEventArgs>(Action<TDelegate> addHandler, Action<TDelegate> removeHandler)
查看 Rx 1.1 的反编译源代码(2.0 源代码已经成为我们所有架构宇航员并且充满了间接性,这使得它更难理解)使用反射器反编译的实际代码片段是这样的:
Action<TEventArgs> o = new Action<TEventArgs>(observer.OnNext);
TDelegate d = CreateDelegate<TDelegate>(o,
typeof(Action<TEventArgs>).GetMethod("Invoke"));
addHandler(d);
所以,问题:
How is it that CreateDelegate is creating a delegate of signature (obj, args) that is bound to an invoke method of signature (args) on the action? Where is obj going?
我不确定我是否理解正确,但似乎这个问题特别像如何CreateDelegate<TDelegate>(o, typeof(Action<TEventArgs>).GetMethod("Invoke")
产生一个只有 args
的方法参数 - o
会发生什么对象?
发生的事情是,是的,o
对象作为 object firstArgument
传递到内部 .NET 框架方法。
public static Delegate CreateDelegate(Type type, object firstArgument, MethodInfo method, bool throwOnBindFailure)
此方法将 firstArgument“绑定(bind)”为基本上是 this
返回方法的指针。在内部,它将在委托(delegate)对象内某处存储对 firstArgument 的引用。我们看不到它的内部,因为它是一个内部 .NET 实现细节,因此它可以做各种奇怪的事情并随意破坏规则。
It feels a bit like it might be around having an open delegate on action and we are coercing the 'this' to be 'firstArguemnt' from CreateDelegate and allowing the args to fall through. If so feels kinda dirty?
是的,这几乎就是正在发生的事情。这就是CreateDelegate
功能是用来做的。
除了它变得比那更脏。 CreateDelegate
只返回类型为 Delegate
的对象- 我们在方法参数等方面没有类型安全 - 然后代码将其转换为 TDelegate
- 这是有效的,因为委托(delegate)是特殊的,你可以将它转换为具有相同“形状”的任何函数类型。如上所述,它是一个内部 .NET 实现细节,因此它可以做各种奇怪的事情:-)
关于c# - Observable.FromEvent 和 CreateDelegate 参数映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13201355/
是否需要基于控件取消订阅事件。 HTML输入: const blur$ = fromEvent(formEle, 'blur').subscribe(x => { this.focused
我正在使用 FromEvent KeyUp 和 debounceTime 在我的应用程序中实现非常简单的搜索功能,如下代码: @ViewChild('inputSearch', { static:
在Observable.FromEvent中有这样一个签名的目的是什么? ?对于 example : var appActivated = Observable.FromEvent( h => App
使用新的 async/await 模型,生成一个在事件触发时完成的 Task 相当简单;你只需要遵循这个模式: public class MyClass { public event Acti
我试图按照 practical observable usage 上的官方 Angular 教程进行操作并尝试导入“fromEvent”: import { fromEvent } from 'rxj
我们如何使用 jasmine 测试 Observable.fromEvent @ViewChild('d') private inputDatePicker: NgbInputDatepicker;
我正在开发 WPF 应用程序以使用 MVVM 练习 Rx。 场景 我有一个带有组合(一些公司名称)和一个详细信息(公司日志)部分的 View (MVVM);当用户从组合框中选择一个项目时,我想填充详细
我为键盘驱动的界面创建了一个关键服务,我发现它似乎为每个订阅者执行完整的链: this.documentKeyEvent = Observable.fromEvent(document, 'keydo
我有两个关于同一件事的问题。 首先,这是在 RxJs 中提交表单的正确方法吗?我正在尝试订阅 mouseEvent,如果是单击,则会向我的后端发出 POST 请求 所以在 react 中我这样做: u
我正在尝试使用 Reactive Extensions 编写代码来处理异步调用,其中启动方法和完成的事件都是静态的。我不会用 var languageSetsLoaded = Observable
我需要连接 rn-fetch-blob 的 onData可观察对象的回调方法。 据我所知,这不是一个事件,fromEventPattern无法使用。我看不到如何使用 create如果这是我的问题的解决
假设我们有以下代码 const clickEvent$ = fromEvent(document, 'click').pipe( pluck('target') ); clickEvent$.
我正在尝试根据光标的位置更改元素的位置。因此我有以下代码: this.ngZone.runOutsideAngular(() => { fromEvent(window, 'mousemove'
假设我有一组股票代码: StockTicker stockTicker = new StockTicker("MSFT", "APPL", "YHOO", "GOOG"); stockTicker
如何将事件数据附加到 Observable.fromEvent? 在我的示例中,我有以下对象数组 var people = [ { name: "Bert", img: "" }, {
我正在尝试从输入事件创建一个 Observable。我已经尝试了几乎所有的方法,但我无法导入“fromEvent”。这是我的代码。我正在使用 Angular 6.0.1 和 RXJS 6.1.0 错误
热/冷/多播可能会造成混淆。我想我现在已经明白了,但我想确认我理解正确。 Looking at the source for rxjs's implementation for fromEvent ,
我有一个 Angular 应用程序,其中包含多个具有特定 ID 的按钮。它们每个都有一个单击函数,我想跟踪用户是否单击了按钮而不更改每个方法中的任何内容。 示例代码: import { Compo
今天我在使用RxJS时遇到一个奇怪的问题。请帮我检查一下。 我正在解决的问题是:“给定一组图像 URL,加载所有图像并将其附加到 div。” 所有要演示的代码片段都在这里: https://paste
我想获取控件的 DataContext 作为 IObservable。我试过这个: Observable.FromEvent (a => this.DataContextChanged +=
我是一名优秀的程序员,十分优秀!