是否可以注入函数<>到一个事件
本文关键字:事件 一个 注入 函数 是否 | 更新日期: 2023-09-27 18:18:09
我在我的项目中使用SerialPort_DataReceived
事件。但是我想用不同的策略来接收event
内部的数据。
我已经谷歌,我发现一种方法是注入Func<>方法和改变他们的行为(策略模式)。
但是,这是可能做同样的事件,如SerialPort_DataReceived
?如果有,我该怎么做?(不违反原则)
实际上我想将Func<>
参数添加到SerialPort_DataReceived
中,如下所示:
public Rs232(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits)
{
SerialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
SerialPort.DataReceived += SerialPort_DataReceived;
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
throw new NotImplementedException();
}
我想改变SerialPort_DataReceived
如下:
private void SerialPort_DataReceived(Func<sth,sth> Strategy,object sender, SerialDataReceivedEventArgs e)
{
throw new NotImplementedException();
}
当然,您可以向包含DataReceived事件处理程序的类注入一些Func<>,并从处理程序调用Func<>。
还可以将接收到的数据传递给特定的处理程序类,该处理程序类具有一个或多个Func<>来根据解码原始字节来处理数据。
如果你谈论串行端口的具体情况,我认为这个答案可能不适用。
我想到了一个特定于适配器的模式来处理方法抽象。假设您已经知道委托和事件处理程序。
public class DeviceASerialPort{
public DeviceASerialPort{
// the parameter below may be self-defined instead of passed
this.SerialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
SerialPort.DataReceived += SerialPort_DataReceived;
}
private SerialPort;
//event delegation here (i forgot how to declare delegation
// let's say the name is also DataReceived
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//null guard
DataReceived(
sth=> {
//custom operation here
return sth;
}
, sender
, e);
}
}
最后,您可以为该串行端口适配器制作接口,甚至注入函数以扩展抽象。