C# Хранение и передача метода в качестве параметра
Я создал некий некий класс SerialConnector, ответственный за работу с COM портом.
Класс открывает порт используя параметры, хранящиеся в объекте класса SerialConnectorProperties.
Одним из свойств SerialConnectorProperties должна быть ссылка на метод класса, который запоняет
SerialConnectorProperties и используя этот объект создает объект SerialConnector.
Я пробовал использовать делегаты, но тогда вываливается исключение о невозможности приведения
типов. Строки, с декларациями я пометил знаками вопроса. Прошу помочь реализовать данную схему
в том виде, в котором я её представил. (На самом деле строки с вопросами - болванки, я не
знаю, что там написать.)
Код:
namespace Something
{
//Класс для хранения параметров соединения (параметров COM порта).
//На самом деле класс заменяет некую структуру параметров.
//Так же класс хранит метод стороннего класса, метод - обработчик события,
//который должен вызываться из класса SerialConnector.
public class SerialConnectorProperties
{
//... параметры соединения
public SerialDataReceivedEventHandler CallBack; //????????
}
//Класс представляющий некоторый коннектор COM порта.
//В конструкторе устанавливаются параметры работы порта
//и назначается обработчик события DataReceived.
public class SerialConnector
{
private SerialPort Port;
public SerialConnector(SerialConnectorProperties Properties)
{
//... настройка порта.
//... здесь должен установиться обработчик.
Port.DataReceived += new SerialDataReceivedEventHandler(Properties.CallBack); //????????
Port.Open();
}
}
//Класс, создающий экземпляр объекта класса SerialConnectorProperties.
//Объект заполняется и передается в качестве параметра конструктору
//класса SerialConnector.
public class MyClass
{
private SerialConnector MyConnector;
public MyClass()
{
SerialConnectorProperties MyProperties = new SerialConnectorProperties();
//... создал объект - хранилище параметров.
//... заполнил свойства - параметры.
//... здесь должен в объекте MyProperties сохранится метод EventHandler.
MyProperties.CallBack = EventHandler; //????????
MyConnector = new SerialConnector(MyProperties);
}
public SerialDataReceivedEventHandler EventHandler(object sender, SerialDataReceivedEventArgs e)
{
return null;
}
}
}
{
//Класс для хранения параметров соединения (параметров COM порта).
//На самом деле класс заменяет некую структуру параметров.
//Так же класс хранит метод стороннего класса, метод - обработчик события,
//который должен вызываться из класса SerialConnector.
public class SerialConnectorProperties
{
//... параметры соединения
public SerialDataReceivedEventHandler CallBack; //????????
}
//Класс представляющий некоторый коннектор COM порта.
//В конструкторе устанавливаются параметры работы порта
//и назначается обработчик события DataReceived.
public class SerialConnector
{
private SerialPort Port;
public SerialConnector(SerialConnectorProperties Properties)
{
//... настройка порта.
//... здесь должен установиться обработчик.
Port.DataReceived += new SerialDataReceivedEventHandler(Properties.CallBack); //????????
Port.Open();
}
}
//Класс, создающий экземпляр объекта класса SerialConnectorProperties.
//Объект заполняется и передается в качестве параметра конструктору
//класса SerialConnector.
public class MyClass
{
private SerialConnector MyConnector;
public MyClass()
{
SerialConnectorProperties MyProperties = new SerialConnectorProperties();
//... создал объект - хранилище параметров.
//... заполнил свойства - параметры.
//... здесь должен в объекте MyProperties сохранится метод EventHandler.
MyProperties.CallBack = EventHandler; //????????
MyConnector = new SerialConnector(MyProperties);
}
public SerialDataReceivedEventHandler EventHandler(object sender, SerialDataReceivedEventArgs e)
{
return null;
}
}
}
P.S. Вообще, строго говоря, я бы хотел просто хранить ссылку на обработчик события в отдельном классе.
В данном случае для меня состоит проблемой как именно, положить, хранить и забрать потом эту ссылку.
Всё так же, как и с обычными переменными.
Тут есть, что почитать на тему. Даже первого примера будет достаточно.
Только в нём разметка немного "поехала" и коммент от области видимости и возвращаемого значения функции не отделился.
А если так - то сделайте эвент нужного типа в классе, добавьте в него обработчик , и храните себе ссылку на этот класс где угодно.
Заодно добавьте в него функции типа RiaseEvent().
Port.DataReceived типа SerialDataEventHandler. Вопрос в том как в классе SerialConnectorProperties
хранить ссылку на метод, расположенный в классе MyClass, метод, который является обработчиком
события.
Всё, сделал, прошу прощения за беспокойство.
Напиши хоть, что сделал-то.
Вечером напишу и разложу.
кто, так или иначе пытался помочь. Далее привожу рабочий код, где строки,
имеющие значение, теперь обозначены восклицательными знаками.
Рабочий вариант.
Код:
namespace Something
{
//Сперва делегат, в области видимости "для всех".
public delegate void CallBackHandler(object sender, SerialDataReceivedEventArgs e); //!!!!!!!!
//Класс для хранения параметров соединения (параметров COM порта).
//На самом деле класс заменяет некую структуру параметров.
//Так же класс хранит метод стороннего класса, метод - обработчик события,
//который должен вызываться из класса SerialConnector.
public class SerialConnectorProperties
{
//... параметры соединения.
//... здесь хранится ссылка на делегат.
public CallBackHandler CallBack; //!!!!!!!!
}
//Класс представляющий некоторый коннектор COM порта.
//В конструкторе устанавливаются параметры работы порта
//и назначается обработчик события DataReceived.
public class SerialConnector
{
private SerialPort Port;
public SerialConnector(SerialConnectorProperties Properties)
{
//... настройка порта.
//... здесь должен установиться обработчик.
//... здесь было верно.
Port.DataReceived += new SerialDataReceivedEventHandler(Properties.CallBack); //!!!!!!!!
Port.Open();
}
}
//Класс, создающий экземпляр объекта класса SerialConnectorProperties.
//Объект заполняется и передается в качестве параметра конструктору
//класса SerialConnector.
public class MyClass
{
private SerialConnector MyConnector;
public MyClass()
{
SerialConnectorProperties MyProperties = new SerialConnectorProperties();
//... создал объект - хранилище параметров.
//... заполнил свойства - параметры.
//... здесь должен в объекте MyProperties сохранится метод EventHandler.
//... теперь MyProperties.CallBack хранит объект делегата от EventHandler.
MyProperties.CallBack = new CallBackHandler(EventHandler); //!!!!!!!!
MyConnector = new SerialConnector(MyProperties);
}
//... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//... здесь была ошибка, возвращаемый тип не SerialDataReceivedEventHandler, а void!!!!!!!!
public void EventHandler(object sender, SerialDataReceivedEventArgs e) //!!!!!!!!
{
}
}
}
{
//Сперва делегат, в области видимости "для всех".
public delegate void CallBackHandler(object sender, SerialDataReceivedEventArgs e); //!!!!!!!!
//Класс для хранения параметров соединения (параметров COM порта).
//На самом деле класс заменяет некую структуру параметров.
//Так же класс хранит метод стороннего класса, метод - обработчик события,
//который должен вызываться из класса SerialConnector.
public class SerialConnectorProperties
{
//... параметры соединения.
//... здесь хранится ссылка на делегат.
public CallBackHandler CallBack; //!!!!!!!!
}
//Класс представляющий некоторый коннектор COM порта.
//В конструкторе устанавливаются параметры работы порта
//и назначается обработчик события DataReceived.
public class SerialConnector
{
private SerialPort Port;
public SerialConnector(SerialConnectorProperties Properties)
{
//... настройка порта.
//... здесь должен установиться обработчик.
//... здесь было верно.
Port.DataReceived += new SerialDataReceivedEventHandler(Properties.CallBack); //!!!!!!!!
Port.Open();
}
}
//Класс, создающий экземпляр объекта класса SerialConnectorProperties.
//Объект заполняется и передается в качестве параметра конструктору
//класса SerialConnector.
public class MyClass
{
private SerialConnector MyConnector;
public MyClass()
{
SerialConnectorProperties MyProperties = new SerialConnectorProperties();
//... создал объект - хранилище параметров.
//... заполнил свойства - параметры.
//... здесь должен в объекте MyProperties сохранится метод EventHandler.
//... теперь MyProperties.CallBack хранит объект делегата от EventHandler.
MyProperties.CallBack = new CallBackHandler(EventHandler); //!!!!!!!!
MyConnector = new SerialConnector(MyProperties);
}
//... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//... здесь была ошибка, возвращаемый тип не SerialDataReceivedEventHandler, а void!!!!!!!!
public void EventHandler(object sender, SerialDataReceivedEventArgs e) //!!!!!!!!
{
}
}
}