gpt4 book ai didi

c# - Observable.FromEvent 和 CreateDelegate 参数映射

转载 作者:可可西里 更新时间:2023-11-01 08:29:37 26 4
gpt4 key购买 nike

我在看

的实现
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/

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