Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
.NET 4.x

Уведомление об изменении свойств класса разного типа

10.02.2024, 13:29. Показов 2115. Ответов 29

Студворк — интернет-сервис помощи студентам
Всем приветы!
Как говорится - о чем долго хотели спросить, но стеснялись (шутка)

В общем, суть в следующем: есть некий класс А, назовем его источником данных, и некий класс Б - соотв. приемник этих данных.
Данные различного типа, будь то string, double... или вообще составные, типа структур или классов.
Для того, чтобы класс Б определил что именно сейчас изменилось в классе А, я использую такой подход:
в классе А объявлены публичные поля этих типов (данные) и некоторый делегат со строковым (string) аргументом. Когда некоторое поле данных изменилось, я делаю Invoke с "названием" параметра, а класс Б, получивший это название теперь "знает" какое поле из класса А дернуть для обновления уже своей модели...

Этот подход использую давно, никаких нареканий и багов связанных с ним нет, потому долго откладывал идею по усовершенствованию его.
Идея "усовершенствования" состоит в том, чтобы использовать событийную модель, но не отдавать все свойства целиком, а только то, что изменилось.

Общий принцип мне понятен, и конечно, со временем я могу самостоятельно разобраться с этим, но если у кого есть какие идеи/примеры/где почитать по этому поводу (серьезные источники, не Метанит!) - буду признателен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.02.2024, 13:29
Ответы с готовыми решениями:

Как получить уведомление о изменении свойств чужого контрола?
Итак имеется компонент TExtDBEditCollection, который подключается к датасету и берет информацию для отрисовки элементов из DataSet.Fields....

Как построить класс так чтобы при изменении одного из свойств, класса создавался новый поток?
Добрый всем день. Помогите разобраться с задачей. Задача: Создайте класс Bank в котором будут следующие свойства: int money,...

Уведомление о изменении файла
Всем привет, тут проблемка: нужно скопировать файл если он изменился, т.е. синхронизировать каталоги, постоянно проверять контрольную сумму...

29
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
11.02.2024, 17:39  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HF Посмотреть сообщение
В чём смысл "приёмника"?
Приемник (часть Model'и) получает данные от источника и прокидывает их уже в свою ViewModel.
Цитата Сообщение от HF Посмотреть сообщение
Это копия класса источника?
Нет. Это свойство (группа свойств), куда попадают значения из источника.
Цитата Сообщение от HF Посмотреть сообщение
И это значит, что отправитель уже знает о получателе
Отправитель "не знает" о получателе. Какая ему разница кто и как использует его данные?
Пока сделано так: "кто подписан, тот и кушает кашу".
Цитата Сообщение от HF Посмотреть сообщение
Можно использовать внутри или снаружи ссылку на этот "источник"
В источнике есть публичный тип, который доступен извне, ну что логично: приемник должен же знать данные какого типа будут приходить (от куда их брать).
А вот наоборот нельзя: в источнике ссылка на приемник не нужна.

Добавлено через 8 минут
Цитата Сообщение от HF Посмотреть сообщение
Внимательно посмотрел и только сейчас заметил
Цитата Сообщение от HF Посмотреть сообщение
И зачем тут события если уже есть зависимость типов
Этот код был для наглядности демонстрации получения имени свойства, в данном случае через string делегата.
Когда шло обсуждение INPC nameof() VS delegate xxx (string yyy).
0
HF
 Аватар для HF
1342 / 926 / 202
Регистрация: 09.09.2011
Сообщений: 2,751
Записей в блоге: 2
11.02.2024, 18:05
Цитата Сообщение от Uswer Посмотреть сообщение
При всём уважении, но ваши слова мимо, т.к. коллекция Properties создаётся при сборке самого объекта без перебора.
При всём уважении.. это было не лично вам. Ещё раз повторю - если вам что-то задело в моих словах, не воспринимайте так близко. Это был разбор кода, а не вашей личности. Если я ошибаюсь в коде - значит я ошибаюсь в фактах. Но вы начали прям отнекиваться от темы и написанного. Боитесь участвовать в диспутах?

Ведь коллекция создаётся? А чем если не перебором? Код не видел, но скорее всего рефлексией по полям класса.

Добавлено через 2 минуты
Цитата Сообщение от wizard41 Посмотреть сообщение
Этот код был для наглядности демонстрации получения имени свойства, в данном случае через string делегата.
Когда шло обсуждение INPC nameof() VS delegate xxx (string yyy).
Но этот пример далёк от реальности? Если да, то стоит всё же привести более близкий пример.
Мой вариант к этому коду какие имеет недостатки для вашего решения?

Цитата Сообщение от wizard41 Посмотреть сообщение
В источнике есть публичный тип, который доступен извне, ну что логично: приемник должен же знать данные какого типа будут приходить (от куда их брать).
А вот наоборот нельзя: в источнике ссылка на приемник не нужна.
А что тогда делает SourceClass в TargetClass?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
11.02.2024, 18:15  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Но этот пример далёк от реальности?
Не совсем. Но этот подход необходимо изменить.
Цитата Сообщение от HF Посмотреть сообщение
Мой вариант к этому коду какие имеет недостатки для вашего решения?
C#
1
source.StringProperty = value;
в Source ничего изменить извне нельзя! Можем только получить (get).
Цитата Сообщение от HF Посмотреть сообщение
А что тогда делает SourceClass в TargetClass?
Говорю же - для демонстрации. В настоящем проекте вытащен только тип (пока их несколько, но скоро будет один, но составной).

Не будем торопить коней, я пока на стадии выбора - как и что применить, чтоб поближе к теме было.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
11.02.2024, 18:18
Uswer,
По сути, всё то, что написал Wolfdp, уже сделано MS и чтобы это использовать надо просто реализовать INPC в отправителе.
Можно пример? Без иронии, я просто не особо понимаю какой механизм реализации именно у слушателя. Мы же вроде не к UI элементу подвязываем, а своей модели.
0
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
11.02.2024, 18:33
Цитата Сообщение от HF Посмотреть сообщение
Но вы начали прям отнекиваться от темы и написанного.
Э-э-э! В данной теме я отметился впервые и сразу нарвался на критику с вашей стороны по отношению к коду, поэтому я слегка в ступоре. Ещё раз отмечу, что не я автор темы.
Цитата Сообщение от HF Посмотреть сообщение
Ведь коллекция создаётся? А чем если не перебором?
Да создаётся. Нет не перебором, там что-то типа того:
C#
1
2
3
4
5
6
7
8
public virtual ТипСвойства ИмяСвойства {
  get { ... }
  set {
    if (ИмяСвойства != value) {
      Properties.SetObject(ИндексИмениСвойства, value);
    }
  }
}
Где далее по коду в методе SetObject при необходимости расширяется Properties (это происходит при построении объекта в момент установки свойства) и в него помещается значение value.

Добавлено через 4 минуты
Цитата Сообщение от Wolfdp Посмотреть сообщение
Без иронии, я просто не особо понимаю
Да да, я немного ошибся. Беру свои слова назад. Просто сразу не совсем было понятно на каком уровне взаимодействие. Я всё осознал после:
Цитата Сообщение от wizard41 Посмотреть сообщение
Приемник (часть Model'и) получает данные от источника и прокидывает их уже в свою ViewModel.
0
HF
 Аватар для HF
1342 / 926 / 202
Регистрация: 09.09.2011
Сообщений: 2,751
Записей в блоге: 2
11.02.2024, 18:45
Цитата Сообщение от wizard41 Посмотреть сообщение
в Source ничего изменить извне нельзя! Можем только получить (get).
Это же тоже было демо Ну уберите сеттер. Теперь норм?
То что вы уже объект там держите - уже подразумевает что вы с ним можете всё что угодно сделать.

Добавлено через 5 минут
Цитата Сообщение от Uswer Посмотреть сообщение
Да создаётся. Нет не перебором, там что-то типа того:
C#
1
Properties.
/ДушнотаОн
Госпиди, я просто занудствую, а вы видимо не поняли на что именно я акцентирую внимание.
Вот она коллекция. И я сказал - что если нет "перебора" тут, то значит просто уже кто-то сделал это ранее.
И я лично "давлю" на то что задача "хочу свойство обновить из события" обрастает всякими рефлексиями и сложным кодом. И для меня уже само наличие такой коллекции означает что под это действие уже были выделены ресурсы и код занимался подготовкой для этого. А раз решение должно быть простым (а это моё первичное отношение к цели), то такие коллекции - симптом сложного решения. Щас понятно?
/ДушнотаОфф
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
11.02.2024, 18:46
Цитата Сообщение от wizard41 Посмотреть сообщение
в Source ничего изменить извне нельзя! Можем только получить (get).
Если у нас есть просто источник данных, а не модель данных -- стоит таки просто написать MQ с соответствующими сообщениями, паблишарами и подписчиками. Попытка через единый ивент тут скорее всего будет не самое лучшее решение.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
11.02.2024, 18:58  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Это же тоже было демо Ну уберите сеттер. Теперь норм?
То что вы уже объект там держите - уже подразумевает что вы с ним можете всё что угодно сделать.
HF, ну мы реально о разных вещах говорим... И потом, с чего вдруг надо кого-то скрывать? Ведь он (источник) для того и существует, чтобы из него брать что нужно. Сами данные он формирует и заполняет свои свойства сам - туда никто вмешаться не может. Суть вопроса вообще не в этом. Это мы куда-то отъехали не в ту сторону...

Если нужно в приемнике обновить некоторое свойство, которое изменилось в источнике, то необходимо:
1. издать сигнал (event) о том что произошло изменение;
2. извлечь то свойство, которое поменялось;
3. изменить сопоставленное ему свойство в получателе.

И это да, это не UI элемент, где механизм Binding-а "сам все разруливает". Тут приходится самому (выискивать) менять именно то, что пришло - причем не важно каким путем: будь то INPC, либо Action либо руками созданный делегат.
Ситуацию усугубляет тот факт, что обновить весь тип целиком (что легко) нельзя, т.к. это затрет (перезапишет) другие свойства, которые в данный момент трогать не нужно.
0
11.02.2024, 18:59

Не по теме:

На всякий: даже не самое оптимальное решение -- ок. Очень сложно придумать идеальное решение, а ресурс "время" далеко не бесконечен.

Допустим остановились на event. Если конечный вариант будет более-менее гибкий под текущие внутренние задачи, перфонас не страдает и новый человек способен за вменяемое время осознать происходящее -- забиваем и работаем с тем что есть.

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

0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
11.02.2024, 19:09  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Попытка через единый ивент тут скорее всего будет не самое лучшее решение
Да, я тоже пришел к этому пониманию.

Добавлено через 9 минут

Не по теме:

Цитата Сообщение от Wolfdp Посмотреть сообщение
но попытка в вечный рефакторинг порочна
Да да, а я любитель такого ). Поэтому в данном случае "на лету" не экспериментирую, ибо дедлайн....

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.02.2024, 19:09

Уведомление об изменении внешнего ip-адреса
Приветствую, коллеги! Ранее создавал тему, собственно, это решение и практикую на объектах с динамическими ip-адресами. А реально ли...

Уведомление об изменении свойства зависимости
Здравствуйте, В ходе написания элемента управления возникла следующая проблема: Не могу вызвать изменение свойства зависимости. ...

Уведомление View об изменении only get свойства
Добрый день. Пишу приложение на WPF + MVVM , возникла такая вот ситуация : у меня есть сервис OracleDBService для работы с БД ,...

Уведомление об изменении файла в сети
Помогите из отобранной строки массива, выбрать символы после "=". И возможно ли избавление от TXTшного файла? set urlData =...

Как отключить всплывающее уведомление при обходе свойств и операторов?
Как отключить вот это окошко?


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru