请问c#中事件处理器如何添加额外的自定义参数?

有一个事件处理方法定义如下:

 public delegate void DIOPCGroupEvent_AsyncReadCompleteEventHandler([In] int TransactionID, [In] int NumItems, [In][MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_I4)] ref Array ClientHandles, [In][MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array ItemValues, [In][MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_I4)] ref Array Qualities, [In][MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_DATE)] ref Array TimeStamps, [In][MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_I4)] ref Array Errors);

正常的订阅处理:

group.AsyncReadComplete += new DIOPCGroupEvent_AsyncReadCompleteEventHandler(Event_AsyncReadComplete);
                        


private void Event_AsyncReadComplete(int TransactionID, int NumItems,  ref Array ClientHandles,ref Array ItemValues, ref Array Qualities,  ref Array TimeStamps, ref Array Errors)
        {
            _logger.LogInformation("异步读取响应事件:raansactionId:{},结果个数:{},结果值:{}", TransactionID,ItemValues.Length,ItemValues);
            for (int i = 1; i <= NumItems; i++)
            {
                object resVal = ItemValues.GetValue(i);
                object resQualitie = Qualities.GetValue(i);
                object resTime = TimeStamps.GetValue(i);
                object resError = Errors.GetValue(i);
                _logger.LogInformation("响应时间:{},返回值:{},数据质量:{},响应异常:{}", resTime, resVal, resQualitie, resError);
            }

        }

目前我的需求是需要在处理事件的时候需要多填一个参数,如string name之类的该如何做呢?
楼主不了解c#,只是目前有一个需求需要调用dll,故采用c#来写。好在c#和java还是比较像的,之前只在c语言中文网看了两个小时教程,就上手实现功能了,一般语法没问题,但是稍微高级一点的语法感觉就不知道该怎么弄了,求教

阅读 2.9k
2 个回答

写一个有所有参数的类:

public class AsyncReadCompleteEventArgs
{
    public int TransactionID { get; set; }
    public int NumItems { get; set; }
    public Array ClientHandles { get; set; }
    public Array ItemValues { get; set; }
    public Array Qualities { get; set; }
    public Array TimeStamps { get; set; }
    public Array Errors { get; set; }
    public string Name { get; set; } // 自定义参数
}

改委托定义:

public delegate void DIOPCGroupEvent_AsyncReadCompleteEventHandler(AsyncReadCompleteEventArgs e);

更改事件处理器的签名:



private void Event_AsyncReadComplete(AsyncReadCompleteEventArgs e)
{
    // 用e访问所有参数
}

那用的第三方的话:

private DIOPCGroupEvent_AsyncReadCompleteEventHandler CreateHandler(string name)
{
    return (int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps, ref Array Errors) =>
    {
        _logger.LogInformation($"Name: {name}, TransactionID: {TransactionID}, NumItems: {NumItems}");
        // ...
    };
}

string name = "YourName";
group.AsyncReadComplete += CreateHandler(name);

新手上路,请多包涵

嗯, 看了一下需求, 也就是说, 想要在已经写好的 EventArgs 基础上, 添加一些其他的附加参数. 这个可以直接用 lambda 包装一层, 然后可以了.

这是一个通用的泛型方法, 当然你也可以添加更多重载. 它用来在原来 EventHandler 的基础上附加一个值. 当然这个值也是泛型的, 传什么都可以.

EventHandler<TEventArgs> CreateEventHandlerWithAdditionalValue<TEventArgs, TValue>(Action<object, TEventArgs, TValue> handler, TValue value) 
  where TEventArgs : EventArgs
{
  return (sender, e) => {
    handler.Invoke(sender, e, value);
  };
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏