0

SerialPort_DataReceived在我的项目中使用事件。但是我想在 this 的主体内有不同的接收数据的策略event

我用谷歌搜索,发现一种方法是将 Func<> 注入方法并改变它们的行为(策略模式)。

但是对于像这样的 evnets 是否可以这样做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();
            }
4

2 回答 2

0

当然,您可以向包含 DataReceived 事件处理程序的类注入一些 Func<> 并从处理程序调用 Func<>。

您还可以将接收到的数据传递到具有一个或多个 Func<> 的某个处理程序类,以根据解码原始字节来处理数据。

于 2013-06-13T15:31:54.207 回答
0

如果您谈论串行端口的具体情况,我认为这个答案可能不适用。

我想到了一种特定于适配器的模式来处理您的方法抽象。假设您已经知道委托和事件处理程序。

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);
    }
}

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

于 2013-06-14T06:06:25.960 回答