我在项目中使用SerialPort_DataReceived
事件。但我希望在event
的正文中有不同的策略来接收数据。
我用google搜索,我发现一种方法是注入Func<>方法和改变他们的行为(战略模式)。
但是,对SerialPort_DataReceived
这样的evnet来说,是否可以这样做呢?如果是,我该怎么做? (不违反原则)
修改
实际上我想将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();
}
答案 0 :(得分:0)
当然你可以注入一些Func&lt;&gt;到包含DataReceived事件处理程序的类并调用Func&lt;&gt;来自处理程序。
此外,您可以将收到的数据传递给具有一个或多个Func&lt;&gt;的特定处理程序类。根据解码原始字节来处理数据。
答案 1 :(得分:0)
如果你谈到串口的具体问题,我认为这个答案可能不适用。
我想到了一个特定于适配器的模式来处理你的Method Abstraction。假设您已经知道了委托和事件处理程序。
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);
}
}
最后,您最终可以为该串行端口适配器创建接口,甚至可以注入该函数来扩展抽象。