是否可以注入函数<>到一个事件

本文关键字:事件 一个 注入 函数 是否 | 更新日期: 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);
    }
}

最后,您可以为该串行端口适配器制作接口,甚至注入函数以扩展抽象。