【问题标题】:Observable.FromEvent custom event transform won't compile with error "Method name expected"Observable.FromEvent 自定义事件转换不会编译错误“方法名称预期”
【发布时间】:2023-03-25 17:42:01
【问题描述】:

我在 .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));

        }
    }
}

上述代码无法编译并给出错误“Method name expected”以 (vs,bs) 开头并转到列表中的最后一个 h。

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

我从这个答案中得到了这个想法:Convert Custom EventHandler to IObservable

【问题讨论】:

    标签: .net observable reactive-programming


    【解决方案1】:

    在我提供的用作解决方案模型的链接中,我错过了 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

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

    查看类 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);
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多