Observable.FromEvent 自定义事件转换无法编译并出现错误 "Method name expected"

Observable.FromEvent custom event transform won't compile with error "Method name expected"

我在 .net 核心和完整的 fw v4.7.2 中创建了错误。使用任何版本的 c# 和随附的响应式扩展。

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; }
        
        static void Main(string[] args)
        {
            var obs_test = Observable.FromEvent<_test, _TestParamList>(
    OnNext => new _test((vs, bs)
        => OnNext(new _TestParamList { vs1 = a, bs1 = b }),
        h => _test += h,
        h => _test -= h));

        }
    }
}

以上代码无法编译并给出错误“预期的方法名称”,以 (vs,bs) 开头并转到列表中的最后一个 h。

我正在尝试对我无法重写的事件实施转换,该事件具有两个数组、一个 int 和一个日期时间值。

我从这个答案中得到了灵感:

在 link 中,我提供了我用作解决方案的模型,但我没有看到 FromEvent 声明的最后两行,如下所示:

handler => axCZKEM.OnAttTransactionEx += handler,
handler => axCZKEM.OnAttTransactionEx -= handler);

axCZKEM 对象是事件源。

在系统中,我试图构建该源已经存在,但我没有在我的 OP 示例中创建它。为了纠正这个问题,我从这里借用了一个制造事件源的例子:How to use Observable.FromEvent instead of FromEventPattern and avoid string literal event names

以上 link 是有关事件和 FromEvent 方法的一般信息的良好来源。

有关假装事件源,请参阅 class Foo。

我稍微重写了转换以获得下面的代码。 我不必在 FromEvent 方法中添加新的事件源,而是需要编写一个名为 ShowParamList 的“事件处理程序”来向自己证明我可以访问事件提供的各种值。

using System;
using System.Reactive.Linq;

namespace ObservableTest
{
    internal class Program
    {
        public delegate void EventTest(int vs, string bs);
        internal class TestParamList { public int vs1; public string bs1; }
        static void Main(string[] args)
        {
            var EventSource = new TestEventSource();
            var obs_test = Observable.FromEvent<EventTest, TestParamList>(
                OnNext => (int vs, string bs) => OnNext(new TestParamList { vs1 = vs, bs1 = bs }),
                h => EventSource.MyEvent += h,
                h => EventSource.MyEvent -= h);

            obs_test.Subscribe(x => ShowParamList(x));
            EventSource.RaiseEvent(1, "first");
            EventSource.RaiseEvent(2, "second");

            Console.ReadKey();
        }
        static void ShowParamList(TestParamList t)
        {
            Console.WriteLine("Int: " + t.vs1.ToString() + " String: " + t.bs1.ToString());
        }
        public class TestEventSource
        {
            private EventTest delegateChain;
            public event EventTest MyEvent
            {
                add
                {
                    delegateChain += value;
                }
                remove
                {
                    delegateChain -= value;
                }
            }
            public void RaiseEvent(int x, string y)
            {
                var temp = delegateChain;
                if (temp != null)
                {
                    delegateChain(x, y);
                }
            }
        }
    }
}