Как распространять и настраивать события для других классов? - PullRequest
0 голосов
/ 15 марта 2012

У меня есть класс SerialPortWrapper, который работает с System.IO.Ports.SerialPort, который включает в себя обработчик события OnSerialDataRecevied.Ниже приведена схема класса, и он работает:

public class SerialPortWrapper : ISerialPortWrapper
{
    public event SerialDataReceivedEventHandler DataReceviedHandler;    

    private readonly SerialPort _serialPort;

    public SerialPortWrapper()
    {
        this._serialPort = new SerialPort
        {
            // configure SerialPort
        };

        this._serialPort.DataReceived += DataReceviedHandler;
        this._serialPort.DataReceived += OnSerialDataRecevied;
    }

    public void Write(byte[] bytes, int offset, int count)
    {
        this._serialPort.Write(bytes, offset, count);
    }

    public void OnSerialDataRecevied(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        var bytes = new UTF8Encoding().GetBytes(sp.ReadExisting());
    }
}

У меня также есть класс, который использует SerialPortWrapper.Я бы хотел, чтобы в этом классе произошло событие, когда OnSerialDataRecevied срабатывает.Предпочтительно, чтобы этот объект события содержал пользовательские данные, которые были бы связаны с SecurityPanel, а не SerialPort data

. В приведенном ниже коде вы можете видеть, что я пытался добавить SecurityDataRecevied в качестве обработчика дляSerialPortWrapper DataReceviedHandler, но это не работает.

public class SecurityPanel : ISecurityPanel
{
    private readonly ISerialPortWrapper _serialPortWrapper;

    public SecurityPanel(ISerialPortWrapper serialPortWrapper)
    {
        _serialPortWrapper = serialPortWrapper;

        _serialPortWrapper.DataReceviedHandler += SecurityDataRecevied;
    }

    private void SecurityDataRecevied(object sender, SerialDataReceivedEventArgs e)
    {
        // this doens't fire. Prefereably it would have a custom EventArgs object, 
        // rather than SerialDataReceivedEventArgs 
    }

    public byte SendMessage(Message message)
    {
        // get bytes from message and send them to the SerialPort
        _serialPortWrapper.Write(bytes, 0, bytes.Length);            
    }
}

У меня есть следующие вопросы:

  • Как я могу распространить событие на классы, которые используют SerialPortWrapper?
  • Как я могу сделать эти пользовательские события, относящиеся к классу, в котором они происходят?

1 Ответ

1 голос
/ 15 марта 2012

Вы на самом деле не поднимаете событие.

Удалить эту строку:

this._serialPort.DataReceived += DataReceviedHandler;

И измените функцию:

public void OnSerialDataRecevied(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    var bytes = new UTF8Encoding().GetBytes(sp.ReadExisting());
    if(DataReceivedHandler != null)
        DataReceivedHandler(sender, e);
}
...