【问题标题】:Convert Custom EventHandler to IObservable将自定义事件处理程序转换为 IObservable
【发布时间】:2018-09-26 00:47:15
【问题描述】:

我目前正在尝试学习 C# 中的反应式编程,尝试将我的旧项目转换为反应式,我使用 dll 文件连接到生物识别机器,这是 dll 暴露的一些事件,我如何转换它使用 Observable.FromEvent 到 Observable?

// I use the event like this,
axCZKEM.OnAttTransactionEx += new _IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM_OnAttTransactionEx);

这是生成的元数据

#region Assembly Interop.zkemkeeper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// C:\Project\C#\obj\Debug\Interop.zkemkeeper.dll
#endregion

using System.Runtime.InteropServices;

namespace zkemkeeper
{
    [ComVisible(false)]
    [TypeLibType(16)]
    public delegate void _IZKEMEvents_OnAttTransactionExEventHandler(
        string EnrollNumber, 
        int IsInValid,
        int AttState,
        int VerifyMethod,
        int Year,
        int Month,
        int Day,
        int Hour,
        int Minute,
        int Second,
        int WorkCode);
}

【问题讨论】:

    标签: c# reactive-programming


    【解决方案1】:

    即使我是响应式编程的新手,但我会尝试,因为没有其他答案, 你需要在这里做两件事。 一,为您的事件参数使用包装器。

    internal class MyArgs
    {
        public string EnrollNumber;
        public int IsInValid;
        public int AttState;
        public int VerifyMethod;
        public int Year;
        public int Month;
        public int Day;
        public int Hour;
        public int Minute;
        public int Second;
        public int WorkCode;
    }
    

    然后使用 FromEvent 和转换器将您的 args 转换为 MyArgs。

      var observable = Observable.FromEvent<_IZKEMEvents_OnAttTransactionExEventHandler, MyArgs>(
             converter => new _IZKEMEvents_OnAttTransactionExEventHandler(
                             (enrollNumber, isInValid, attState, verifyMethod, year, month, day, hour, minute, second, workCode)
                             => converter(new MyArgs
                             {
                                 EnrollNumber = enrollNumber,
                                 IsInValid = isInValid,
                                 AttState = attState,
                                 VerifyMethod = verifyMethod,
                                 Day=day,
                                 Hour=hour,
                                 Minute=minute,
                                 Month=month,
                                 Second=second,
                                 WorkCode=workCode,
                                 Year=year
                             })
                     ),
             handler => axCZKEM.OnAttTransactionEx += handler,
             handler => axCZKEM.OnAttTransactionEx -= handler);
    

    【讨论】:

    • 已经尝试过了,错误;无法将类型“System.EventHandler”隐式转换为“zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler”
    • 看起来您的事件处理程序有两个定义。 'IZKEMEvents_OnAttTransactionExEventHandler' 是否是其他程序集的一部分,并且您还在代码中声明了它。
    • 不,我没有在我的代码中声明任何_IZKEMEvents_OnAttTransactionExEventHandler
    • 您使用的是哪个 dot net 框架和 C# 版本?
    • .Net 4.6.1 C# 7.0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多