简体   繁体   English

将自定义EventHandler转换为IObservable

[英]Convert Custom EventHandler to IObservable

I'm currently try to learning Reactive programming in C# with trying to convert my old project to Reactive, I use a dll file to connect to a biometric machine, this is some event exposed by the dll, how I can convert this to Observable using Observable.FromEvent? 我目前正在尝试通过尝试将旧项目转换为Reactive来学习C#中的Reactive编程,我使用dll文件连接到生物识别机器,这是dll暴露的事件,我如何使用以下方法将其转换为Observable Observable.FromEvent?

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

and this is the generated metadata 这是生成的元数据

#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);
}

Even I am new to Reactive programming, But I will try as there are no other answers, You will need two things here. 即使我是Reactive编程的新手,但由于没有其他答案,我会尝试的,这里您将需要两件事。 One, Use a wrapper for your event args. 第一,为事件args使用包装器。

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;
}

Then use FromEvent with a converter to convert your args into MyArgs. 然后将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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM