Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для moskitos80
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359

Расширяющие методы и генерация событий

19.06.2017, 16:06. Показов 1945. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Изучаю C# тема события. Решил попрактиковаться и написал такой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
 
namespace Test1
{
    public class Programm
    {
        public static void Main ()
        {
            PostMan postman = new PostMan ();
            
            postman.Message += (sender, args) => {
                Console.WriteLine (args.Message);
            };
 
            postman.BringMessage ();
        }
    }
    
    class PostMessageArgs: EventArgs
    {
        public readonly string Message;
        public PostMessageArgs(string msg)
        { Message = msg; }
    }
 
    class PostMan
    {
        public delegate void MessageHadler(object sender, PostMessageArgs args);
        public event MessageHadler Message;
        public static void BringMessage()
        { 
            Message.Invoke (this, new Test1.PostMessageArgs("Take your message ... "));
        }
    }
}
Он работает без проблем. Теперь я решил вспомнить тему "расширяющие методы" и написал следующий код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using System;
using MyExtensions;
 
namespace Test1
{
    public class Programm
    {
        public void run ()
        {
            PostMan postman = new PostMan ();
            
            postman.Message += (sender, args) => {
                Console.WriteLine (args.Message);
            };
 
            postman.BringMessage ();
        }
    }
    
    class PostMessageArgs: EventArgs
    {
        public readonly string Message;
        public PostMessageArgs(string msg)
        { Message = msg; }
    }
 
    class PostMan
    {
        public delegate void MessageHadler(object sender, PostMessageArgs args);
        public event MessageHadler Message;
    }
}
 
namespace MyExtensions
{
    static class Extensions
    {
        public static void BringMessage(this Test1.PostMan _this)
        { 
            _this.Message.Invoke (_this, new Test1.PostMessageArgs("Take your message ... "));
        }
    }
}
- Теперь компилятор выдает ошибку:

The event PostMan.Message can only appear on the left hand side of += or -= (except when used from within the type 'PostMan')

Правильно ли я понимаю что я могу вызвать Message.Invoke и т.п. только внутри типа PostMan и нигде более ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.06.2017, 16:06
Ответы с готовыми решениями:

Расширяющие методы
Собственно поясните мне что это такое, желательно на пальцах

Генерация событий Windows
Товарищи, подскажите, пожалуйста, как решить такую проблему - мне нужно чтобы программа (на Delphi) висела в памяти и периодически...

Модель событий (генерация и обработка)
Есть в языке механизм делегирования событий, т.е в одном месте оно создается, а в другом обрабатывается. Что очень удобно для работы в...

7
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18259 / 14184 / 5366
Регистрация: 17.03.2014
Сообщений: 28,870
Записей в блоге: 1
19.06.2017, 16:10
Лучший ответ Сообщение было отмечено moskitos80 как решение

Решение

Цитата Сообщение от moskitos80 Посмотреть сообщение
Правильно ли я понимаю что я могу вызвать Message.Invoke и т.п. только внутри типа PostMan и нигде более ?
Да, события могут генерироваться только тем типов который им владеет. Тоже самое верно и для генерации события без Invoke и его обнуления - это тоже может делать только тип где событие было объявлено. Наследники класса также лишены подобной привилегии.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.06.2017, 18:49
OwenGlendower, но, можно вспомнить про такую штуку, как виртуальные события, и все становится не таким однозначным...
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18259 / 14184 / 5366
Регистрация: 17.03.2014
Сообщений: 28,870
Записей в блоге: 1
20.06.2017, 12:50
Psilon, что именно становится неоднозначным? Наследник же все равно не может сгенерировать событие. Единственное что дает virtual event это управление процессом подписки/отписки.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.06.2017, 13:15
OwenGlendower, ой ли, только это?

Добавлено через 1 минуту
Ну то есть это формально "только подписка и отписка", но по факту выливается в более непонятные вещи.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18259 / 14184 / 5366
Регистрация: 17.03.2014
Сообщений: 28,870
Записей в блоге: 1
20.06.2017, 13:19
Psilon, эти "непонятные веши" не противоречат утверждению что событие принадлежит классу в котором оно объявлено.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.06.2017, 13:26
OwenGlendower, ок, будем считать, я неправильно выразился.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18259 / 14184 / 5366
Регистрация: 17.03.2014
Сообщений: 28,870
Записей в блоге: 1
20.06.2017, 13:39
Psilon, мы просто с немного разных сторон на это смотрели. Напоминание о существовании вирутуальных событий и их тонкостях в любом случае полезно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.06.2017, 13:39
Помогаю со студенческими работами здесь

Генерация разных событий на одну и ту же кнопку
Добрый день уважаемые форумчане. Нужна ваша помощь. Нужно сделать примерно такое. При клике на кнопку открывается MsgBox. Затем MsgBox...

Периодическая генерация событий сообщений окну - как реализовать?
Почитал немного про создание оконных приложений - очень интересно. Даже пятнашки, думаю, могу навскидку за несколько минут написать. А...

методы событий для динамических объектов
При написании проги с динамическим созданием объектов столкнулся с проблемой: не знаю, какие функции прописывать для событий объектов,...

Flash в WebBrouser, генерация событий мыши и клавиатуры в неактивном окне
Доброго времени суток. Недавно у меня возникла задача: необходимо перехватывать события мыши (типа click mouseup mousedown move) и...

Генерация событий сервером dll (.NET) для клиента exe (Delphi) в отдельном потоке
Здравствуйте, господа. Имею обратиться к вам, дабы не потерять веру в светлое будущее. Вкратце: есть dll-ка на C# .NET 3.5. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru