You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:06:03