Observable.FromEvent绑定带in修饰符参数事件时抛出异常
问题原因
Observable.FromEvent默认重载的内部反射桥接逻辑不支持带in/ref/out修饰符的委托参数。
Rx在自动生成事件适配委托时,会通过反射校验委托签名一致性,要求事件委托的参数必须为值传递形式。当结构体参数加了in修饰符(即只读引用传递)时,反射创建委托的步骤会判定签名不兼容,直接抛出Cannot bind to the target method because its signature is not compatible with that of the delegate type异常,和你提供的调用栈完全对应。
移除in修饰符后参数变为值传递,符合Rx默认的签名校验规则,因此可以正常运行。
解决方法
不需要修改第三方库的委托定义,使用FromEvent支持手动传入转换逻辑的重载,绕开内置的反射签名校验即可:
void Start() { Debug.WriteLine("Start"); var o = Observable.FromEvent<Test.TheDelegate, SomeStruct>( // 手动定义委托转换规则:将原事件的in参数取值后传给Rx的下游处理器 rxHandler => (in SomeStruct s) => rxHandler(s), h => test.TheEvent += h, h => test.TheEvent -= h ) .Subscribe(OnNext); }
这个写法是Rx官方支持的标准用法,专门用于处理事件委托签名和Rx预期签名不匹配的场景,运行时不会走有问题的反射创建委托逻辑,性能和稳定性和正常用法没有区别。
如果后续遇到带ref/out参数的事件委托,也可以用同样的方式,在转换lambda中处理参数传递逻辑即可。
内容的提问来源于stack exchange,提问作者Kage
相关产品推荐
相关产品推荐

