当前位置: 首页 > 知识库问答 >
问题:

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

晋奕
2023-08-18

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

 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个答案

岳玉书
2023-08-18

嗯, 看了一下需求, 也就是说, 想要在已经写好的 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);  };}
隗高旻
2023-08-18

写一个有所有参数的类:

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);
 类似资料:
  • 我在这里看到了一些例子:http://docs.oracle.com/javase/7/docs/api/javax/swing/joptionpane.html 它似乎表明我应该用一个自定义的按钮列表来替换我的组合框,这不是我想要的。我需要有3个按钮(好的,跳过,取消),以及项目列表。 更新:为了说明我的GUI应该是什么样子: null 目前我的代码如下所示: 灵感来自:Java:showInp

  • 对于我的一个Kafka streams应用程序,我需要同时使用DSL和处理器API的特性。我的流媒体应用程序流是 聚合之后,我需要向接收器发送单个聚合消息。因此我定义拓扑如下 知道这里出了什么问题吗?

  • 如何向Log4J2的JsonLayout添加自定义参数? 还有一种方法可以将模式添加到JsonLayout的消息元素中吗? 我已经尝试了这里列出的选项-> logging.apache.org/log4j/2.x/manual/layouts.html#JSONLayout 请救命!

  • 问题内容: 谁能给我一个创建事件和处理程序的自定义集的示例。假设您有一个Person对象,您希望小部件知道它是否已更新。 您创建了一个HandlerManager,现在您必须创建一个Event和一个Handler。您将如何定义这些类,以便可以订阅和引发事件? 大多数事件都是基于DOM的,而我想创建一些自定义事件和处理程序,这些事件和处理程序可以在任何基于浏览器的事件之外触发。 问题答案: 这是一个

  • 在 https://editor.swagger.io/ 这给了我一个错误

  • 问题内容: 我想在选项-e触发时将其他参数传递给customAction,例如另一个类的实例。我怎样才能做到这一点?我尝试过的一切都出错了。 问题答案: