|
|
|||||||||||
.NET 4.x Как получить свойство класса?13.06.2017, 22:23. Показов 7160. Ответов 101
Метки нет (Все метки)
В продолжении темы визитора
Есть, к примеру, вот такой код:
0
|
|||||||||||
| 13.06.2017, 22:23 | |
|
Ответы с готовыми решениями:
101
Как поместить свойство класса типа Enum в конструктор Можно ли как-то получить из одного класса исходный код другого класса? |
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
|||||||
| 16.06.2017, 08:30 | |||||||
0
|
|||||||
|
|
||||||||
| 16.06.2017, 08:43 [ТС] | ||||||||
|
Возможно тут я использовал слово не в том контексте. Сорян.
Добавлено через 43 секунды ![]() Добавлено через 3 минуты Usaga, я понимаю, что читать чужой код часто бывает трудно. Особенно если он написан не профессионалом. Но в той теме прям вот кусок ViewModel выложен Классы или интерфейсы? вы его пропустили. Отсюда и ваши вопросы и недопонимание. + моя местами программерская безграмотность. Но мы же вроде в теме "новичков" ))) Добавлено через 7 минут Ну а теперь представьте: то свойство Item (в том коде) это:
0
|
||||||||
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
|||
| 16.06.2017, 08:59 | |||
Делать универсально - значит возвращаться к тому, с чего начали.По поводу фрагмента кода. Содержимое описанное интерфейсом ISpecificationItem можно было бы вынести в отдельный класс, который либо будет контейнером для всех остальных, либо же сам будет включаться во все остальные классы. Получается, что это и есть точка соприкосновения классов. И нужно оно, как я понял, только для отображения в DataGrid. Тут получается, что способ визуализации у вас пролез в модель данных и бизнес-логику, что не есть гуд.Добавлено через 3 минуты И ещё: интерфейсом выражают действия, которые можно совершить над классом, а не его содержимое (IClonnable, IComaprable).
0
|
|||
|
|
|||||||
| 16.06.2017, 09:10 [ТС] | |||||||
![]() ISpecificationItem - это базовая сущность. SpecRowViewModel - это модель представления для сущностей.ISpecificationItem.Добавлено через 3 минуты там есть ещё что совершать НАД классом. В свою очередь, в классе расписано ЧТО нужно совершать в конкретно этом классе. Ибо SetDeep() для Part это одно, а SetDeep() для Material - вообще другое. Т.е. метод SetDeep() работает с внутренними, присущими только конкретному классу, свойствами. А результат должен быть один => у каждого класса есть свойство double DeepCount {get;set;}Добавлено через 5 минут Для ячейки в строке DataGrid (в столбце "обозначение материала"), класс SpecRowViewModel берёт свойство класса Material как Materia:Designation, а для класса Part берёт как Part:MaterialPanelData:MaterialDesignation Кто тут куда просачивается по вашему - я не понял.Добавлено через 1 минуту и я у него попросил чуть больше разъяснений. Может реально нужно что-то сделать по другому.
0
|
|||||||
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
|||
| 16.06.2017, 09:10 | |||
|
0
|
|||
|
|
||||
| 16.06.2017, 09:13 [ТС] | ||||
...ViewModel на это какбэ намекает)))ISpecificationItem) (это я про свойства, методы) от этого НЕ изменится.
0
|
||||
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
||
| 16.06.2017, 09:17 | ||
|
skilllab, видите в чём проблема. Чтобы дать точный и конкретный совет или рекомендацию, нам нужно обладать всей информацией: что есть, почему оно так сделано было, а не иначе, какие взаимосвязи между объектами.
Предоставленной информации уже хватило, чтобы понять, что пути решения есть. Добавлено через 1 минуту
0
|
||
|
|
|||
| 16.06.2017, 09:24 [ТС] | |||
SpecRowViewModel (это абстрактный класс) ищу кто там именно SpecMaterialRow:SpecRowViewModel и дёргаю у него именно то самое уникальное свойство Thickness, которого НЕТ в абстрактном классе. Вот тут-то и возникает каст )))Добавлено через 15 секунд SpecRowViewModel (это абстрактный класс) ищу кто там именно SpecMaterialRow:SpecRowViewModel и дёргаю у него именно то самое уникальное свойство Thickness, которого НЕТ в абстрактном классе. Вот тут-то и возникает каст ))) Который вот уже на протяжении 2-х тем обсасываю как применить визитёра, вместо каста.
0
|
|||
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
|
| 16.06.2017, 09:56 | |
Сообщение было отмечено skilllab как решение
Решение
skilllab, я могу вам предложить одно решение. Без кастов и визитёров.
Я не уверен, что оно не попахивает наркоманией, но всё же.Вы раскладываете свои объекты строго по разным коллекциям, в соответствии с их типами. Коллекции типизированы конкретными типами, а не общим классом. Формируете "основную" коллекцию, которая для DataGrid (или ещё для чего). В неё набиваете все объекты из всех других коллекций предварительно завернув их в свою обёртку SpecRowViewModel. В эту обёртку добавляете целочисленный или строковой признак типа объекта и ссылку (типа object или базового класса) на данный объект. При переборе, вы определяете (по признаку) в какой коллеции искать объект, потом лезете в нужную коллецию и там его ищите по ссылке из SpecRowViewModel. Профит.Или такой вариант: опять же, в обёртке есть признак типа объекта и пять свойств для каждого возможного "завёрнутого" типа. Валидено, естественно, будет только одно. Опять же, никакого кастинга. Посмотрели, что в признаке, обратились к нужному свойству. Или даже без признака, просто свойства перебираем, пока попадётся то, что не null. Как вам такие варианты? Никаких визитёров, никаких кастов и рефлексии. В модели данных вмешиваться не нужно, так как всё возня будет только в обёртке, на которую вообще плевать. А? ![]() Добавлено через 2 минуты Второй вариант выглядит вполне себе рабочим. И быстрым. Посмотрели на признак - обратились к нужному свойству. Тут даже перебирать ничего ненужно (я про отдельные коллекции для каждого типа объектов). Простой switch где надо и всё. Добавлено через 1 минуту Не по теме: Блин, что я раньше-то не подумал так вам посоветовать. Мозг засрал визитёрами всякими в двух темах. :D Добавлено через 16 минут Кстати, у вас как SpecRowViewModel определяет куда нужно лезть за данными? У вас пять вариантов SpecRowViewModel или через те же IS\AS?
1
|
|
|
|
||
| 16.06.2017, 10:18 [ТС] | ||
Т.е. под каждую сущность свой ...ViewModel но, от одного абстрактного класса SpecRowViewModel. Тип ...ViewModel теперь уже определяю по некоему EViewModel Tag {EViewModel.Part; EViewModel.Material...} и далее уже конкретный каст.
0
|
||
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
|
| 16.06.2017, 10:27 | |
|
skilllab, не нужно кастить. Пять ссылок на пять разных типов. Только одна будет указывать на нужное и будет задаваться при создании объекта-обёртки. Не могу сказать, что это элегантное решение, но для вашего случая вполне проканает.
Я бы постарался сделать иначе, более правильно. Но, думаю, что уже хватит тему мусолить.
1
|
|
|
|
|
| 16.06.2017, 10:32 [ТС] | |
|
" сделать иначе, более правильно" - тогда уже, с учётом узнанного вами от меня, про модель данных, вам уже нужно будет зарплату платить
![]() Там уже работа пойдёт, а не помощь на форуме. Я опробую ваше предложение выше на выходных. Спасибо. Будет затык. В эту же тему напишу.
0
|
|
|
|
||||||||||||||||||||||
| 16.06.2017, 11:54 | ||||||||||||||||||||||
|
Поэтому я сам себе придумаю проблему и сам же ее попытаюсь решить ![]() Итак, у нас есть входной список god-объектов (на самом деле плоская таблица). Каждая строка содержит некий enum, который определяет тип строки. При этом строка может содержать разные свойства, которые мы хотим отобразить в гриде. Проблема в том, что свойство Name может быть в разных свойствах исходного объекта, в зависимости от его "типа". Наша исходная задача в виде кода выглядит так:
Я так понимаю вы пытаетесь решать эту проблему следующим образом:
Альтернативных вариантов решения - масса. Вариант визитора я уже рассматривать не буду, хотя он тоже применим. Рассмотрим два варианта которые довольно очевидны и приходят на ум сразу: 1) Вариант 1 - специализированные модели (реализуется паттерн стратегия):
Саму модель я сделал через делегаты (это для того, что бы не плодить отдельный класс под каждую модель, хотя возможно это понадобится). Как по мне - это самый естественный путь решения задачи. 2) Второй вариант - компонентная модель. Хотя это не самый очевидный способ решения вашей задачи, она может иметь свои преимущества. Код:
Поэтому здесь нет классов типа Part, Material и т.п. Каждый объект это контейнер с компонентами. Если данный класс поддерживает свойство Name - значит в нем будет компонент NameComponent. Если нет - не такого компонента не будет. Обращаю внимание на то, что не обязательно делать отдельный компонент на каждое свойство - можно разбить свойства на компоненты содержащие по нескольку свойств, которые всегда идет вместе. Оба предложенные варианты обеспечивают связь с самым исходным god объектом. но эту связь конечно можно порвать и хранить свойства в оторванном виде, зависит от ваших задач. Итого, оба предложенные варианты решают исходную задачу: Изменение внутренней структуры доменных объектов не меняют view model. Моделька отображения остается одинаковой. Если нам нужно добавить новый объект, то логика его отображения задается "по месту" - либо в самом объекте (в первом варианте - в методе GetModel) либо в парсере (во втором варианте). Вариантов решения на самом деле может быть больше. Например компонентная модель может содержать не компоненты-свойства, а компоненты-аксессоры (accessors) - которые будут не хранить сами свойства а лишь определять способ доступа к свойствам исходного объекта.
1
|
||||||||||||||||||||||
|
|
||||||
| 18.06.2017, 11:28 [ТС] | ||||||
INotify... что для модели что для VM.Второй вариант почти та же "стратегия" от Storm23. Просто будет одна толстая SpecRowViewModel с кучей "Метод-Свойство". Хмм...Добавлено через 16 минут Добавлено через 1 минуту
0
|
||||||
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
|||||
| 18.06.2017, 13:43 | |||||
![]()
0
|
|||||
|
|
|||||||||||||
| 18.06.2017, 14:06 [ТС] | |||||||||||||
|
Типа как:
изначальное решение моё с кастом? Или изначальное решение разделять на независимые сущности с некоторым набором только своих свойств + общие для все свойства?Добавлено через 4 минуты Хотя даже Tag можно не пихать в конструктор, а инициализировать его. Ну да, чутка метаданных... Типа как:
0
|
|||||||||||||
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
||||
| 18.06.2017, 14:22 | ||||
|
0
|
||||
|
|
||||||||
| 18.06.2017, 14:39 [ТС] | ||||||||
|
Тогда я снова вас не понимаю))
Тогда получается что: раз:
0
|
||||||||
|
14811 / 9584 / 1368
Регистрация: 21.01.2016
Сообщений: 36,099
|
|||||||
| 18.06.2017, 15:05 | |||||||
0
|
|||||||
|
|
|
| 18.06.2017, 15:16 [ТС] | |
|
Таак, а в самой ViewModel как будет определяться свойство
Detail?И посмотрев в сообщение 56 - что там не верно? Если вы делаете то же.
0
|
|
| 18.06.2017, 15:16 | |
|
Свойство класса возвращает объект другого класса
Как получить ссылку на метод класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|