Observable.FromEvent转换自定义事件报"Method name expected"无法编译问题
错误原因
- 括号配对错误:转换委托的代码块括号未正确闭合,导致编译器无法识别后续lambda表达式的结构,抛出
Method name expected错误 - 参数名不匹配:委托接收的参数是
vs、bs,构造参数类时错误使用了未定义的a、b变量 - 事件操作对象错误:不能直接对委托类型
_test执行加减订阅操作,必须先声明该委托类型的实例事件字段 - 泛型重载参数对应有误,lambda参数的作用关系混淆
修正后的可运行示例代码
using System.Reactive.Linq; namespace ObservableTest { internal class Program { // 自定义委托(对应你不可修改的事件委托定义) public delegate void _test(int vs, byte bs); // 自定义参数封装类 internal class _TestParamList { public int vs1; public byte bs1; } // 必须先声明对应委托的事件实例,不能直接操作委托类型 private static event _test TestEvent; static void Main(string[] args) { var obs_test = Observable.FromEvent<_test, _TestParamList>( // 第一步:把观察者的OnNext方法转换成你的自定义委托类型 OnNext => new _test((vs, bs) => { // 把委托的多个参数封装成你要的自定义参数类,传给OnNext OnNext(new _TestParamList { vs1 = vs, bs1 = bs }); }), // 第二步:订阅事件的逻辑 h => TestEvent += h, // 第三步:取消订阅事件的逻辑 h => TestEvent -= h ); // 测试用代码:订阅Observable、触发事件 obs_test.Subscribe(p => Console.WriteLine($"vs1:{p.vs1}, bs1:{p.bs1}")); TestEvent?.Invoke(123, 0x11); } } }
多参数场景适配(对应你的真实业务场景:两个数组+int+DateTime)
直接修改委托定义和参数封装类即可,逻辑通用:
// 你的不可修改的自定义委托 public delegate void CustomEventDelegate(byte[] arr1, int[] arr2, int count, DateTime time); // 自定义参数封装类 public class CustomEventParam { public byte[] Array1 { get; set; } public int[] Array2 { get; set; } public int Count { get; set; } public DateTime TriggerTime { get; set; } } // 对应事件实例 private static event CustomEventDelegate CustomTestEvent; // 转换为IObservable的代码 var customObs = Observable.FromEvent<CustomEventDelegate, CustomEventParam>( OnNext => new CustomEventDelegate((arr1, arr2, count, time) => { OnNext(new CustomEventParam { Array1 = arr1, Array2 = arr2, Count = count, TriggerTime = time }); }), h => CustomTestEvent += h, h => CustomTestEvent -= h );
内容的提问来源于stack exchange,提问作者mooncaptain
相关产品推荐
相关产品推荐

