Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C# Хранение и передача метода в качестве параметра

82K
19 июня 2012 года
RobotMan
6 / / 19.06.2012
Здравствуйте.
Я создал некий некий класс 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;
        }
    }
}
Заранее спасибо.

P.S. Вообще, строго говоря, я бы хотел просто хранить ссылку на обработчик события в отдельном классе.
В данном случае для меня состоит проблемой как именно, положить, хранить и забрать потом эту ссылку.
414
19 июня 2012 года
CassandraDied
763 / / 24.05.2012
Какая-то странная логика приложения.
Всё так же, как и с обычными переменными.
Тут есть, что почитать на тему. Даже первого примера будет достаточно.
Только в нём разметка немного "поехала" и коммент от области видимости и возвращаемого значения функции не отделился.
40K
19 июня 2012 года
D129
228 / / 18.04.2012
А зачем вам хранить делегат в отдельном классе? Чтобы его вызвать? (Догадываюсь)

А если так - то сделайте эвент нужного типа в классе, добавьте в него обработчик , и храните себе ссылку на этот класс где угодно.

Заодно добавьте в него функции типа RiaseEvent().
82K
19 июня 2012 года
RobotMan
6 / / 19.06.2012
Эвент нужного типа уже есть в классе.
Port.DataReceived типа SerialDataEventHandler. Вопрос в том как в классе SerialConnectorProperties
хранить ссылку на метод, расположенный в классе MyClass, метод, который является обработчиком
события.
82K
19 июня 2012 года
RobotMan
6 / / 19.06.2012
Всё, сделал, прошу прощения за беспокойство.
414
19 июня 2012 года
CassandraDied
763 / / 24.05.2012
Напиши хоть, что сделал-то.
82K
19 июня 2012 года
RobotMan
6 / / 19.06.2012
Вечером напишу и разложу.
82K
19 июня 2012 года
RobotMan
6 / / 19.06.2012
Заранее хочу сказать спасибо всем, кто прочитал мой пост, а особенно тем,
кто, так или иначе пытался помочь. Далее привожу рабочий код, где строки,
имеющие значение, теперь обозначены восклицательными знаками.

Рабочий вариант.

Код:
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) //!!!!!!!!
        {
        }
    }
}
Тема закрыта.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог