有一个事件处理方法定义如下:
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语言中文网看了两个小时教程,就上手实现功能了,一般语法没问题,但是稍微高级一点的语法感觉就不知道该怎么弄了,求教
嗯, 看了一下需求, 也就是说, 想要在已经写好的 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); };}
写一个有所有参数的类:
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,例如另一个类的实例。我怎样才能做到这一点?我尝试过的一切都出错了。 问题答案: