C# 将自定义EventHandler转换为IObservable

C# 将自定义EventHandler转换为IObservable,c#,reactive-programming,C#,Reactive Programming,我目前正在尝试学习C语言中的反应式编程,尝试将我的旧项目转换为反应式,我使用dll文件连接到生物识别机器,这是dll公开的一些事件,如何使用Observable.FromEvent将其转换为Observable // I use the event like this, axCZKEM.OnAttTransactionEx += new _IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM_OnAttTransactionEx); 这是生成的元

我目前正在尝试学习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);
}

即使我是反应式编程新手,但我会尝试,因为没有其他答案, 你需要两样东西。 第一,为事件参数使用包装器

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和转换器将参数转换为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.\u IZKEMEvents\u OnAttTransactionExEventHandler”看起来您的事件处理程序有两个定义。“IZKEMEvents_OnAttTransactionExEventHandler”是其他程序集的一部分,并且您也在代码中声明了它。否,我没有在我的代码中声明任何_IZKEMEvents_OnAttTransactionExEventHandler您使用的是哪个dot net框架和C版本?.net 4.6.1 C 7.0