|
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
|
|
.NET Core Передать параметры между двумя экземплярами класса05.02.2023, 01:57. Показов 826. Ответов 14
Метки нет (Все метки)
Есть два экземпляра одного и того же класса из публичными переменными, есть ли способ установить переменные из одного экземпляра в другой сразу все, не прибегая к переопределению каждой переменной по отдельности? Я знаю что в ICloneable используется MemberwiseClone, есть ли аналог для уже существующих классов?
0
|
|
| 05.02.2023, 01:57 | |
|
Ответы с готовыми решениями:
14
Передача события между разными экземплярами одного класса Как передать параметры класса в вызов универсальной функции, для конструктора этого класса
|
|
Модератор
|
||||||||||||||||||||||
| 05.02.2023, 14:57 | ||||||||||||||||||||||
|
В ограниченных случаях рефлексия поможет, но не всегда. Рефлексией можно только скопировать значения все полей, которые можно записать, но не всегда этого достаточно. Могут быть поля "только для чтения", а могут быть поля которые обязательно должны иметь разные значения для разных экземпляров. Поэтому лучше в общем случае задать интерфейс копирования и реализовать его в нужных вам типах. Вот набор интерфейсов и методов из моего старого проекта. Сразу предупреждаю - я не помню насколько он в рабочем состоянии. Вроде, должно всё работать, но гарантировать не могу - протестируйте сами.
В рантайм могут проблемы, если в методы копирования попадёт экземпляр текущего несовместимый с другим экземпляров, то есть если в текущем будут какие-то поля которых нет в другом.
0
|
||||||||||||||||||||||
|
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
|
|||||||||||
| 05.02.2023, 15:42 [ТС] | |||||||||||
|
Элд Хасп, у меня какраз таки инициализация проходит с помощью рефлексии, а скопировать нужно геттеры/сеттеры, я реализовать копирование с помощью GetProperties, но возможно я что то делаю не так.
Задача такова. Я хочу сделать абстрактный класс, который будет содержать в себе геттеры/сеттеры, а класс который будет его наследовать брал значения при инициализации из атрибута. Но поскольку конечный класс, и его аттрибут это два разные экземпляра - надо как то запихнуть их из атрибута в экземпляр. Может есть вариант по проще? Код ниже в принципе работает и меня устраивает, но все же.. Кликните здесь для просмотра всего текста
0
|
|||||||||||
|
Модератор
|
|||||
| 05.02.2023, 16:03 | |||||
|
А вот поэффективнее можно. Не следует для каждого вызова Initialize заново вызвать всю рефлексию, проходить по всем типам сборки. Тем более что типы могут быть и не в одной сборке. У вас есть тип объекта который нужно инициализировать this.GetType().По этому типу проходите по цепочке базовых типов до нужного вам или до object. Для каждого типа создаёте делегат инициализации. Все делегаты инициализации сохраняете в статическом словаре по его типу. При этом создаёте цепочку тип сначала вызывает инициализатор базового, а потом свой. При следующем вызове Initialize сначала проверяете есть ли для него инициализатор.Если нет создаёте, если есть, то используете уже имеющийся. Добавлено через 7 минут И часто даже свойства без геттера можно задублировать через поле которое оно использует. Любые решения, конечно, очень критичны к тому как вы собираетесь их использовать. Если вам это подходит, то конечно стоит так и сделать. Очень не нравится вот этот фрагмент { _instance = this; Initialize(); }.
0
|
|||||
|
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
|
|
| 05.02.2023, 16:04 [ТС] | |
|
Элд Хасп, на самом деле класс InventoryManager в конечном проекте будет тоже инициализироваться через рефлексию, но уже сторонним модулем, так же он будет protected и sealed, в общем он будет существовать в единственном экземпляре, а инициализация проходить только при старте проект. Но в общем все понятно, спасибо.
0
|
|
|
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
|
||||||
| 05.02.2023, 16:10 [ТС] | ||||||
|
Элд Хасп,
Кликните здесь для просмотра всего текста
Из экземпляра атрибута в экземпляр предмета и дальше по коду
0
|
||||||
|
Модератор
|
|||||||
| 05.02.2023, 16:51 | |||||||
|
DaVillka, вот что-то в таком духе (набросал по быстрому):
То что вы делаете, как я понял, создаёте экземпляр класс и инициализируете его свойства из атрибута класса. Так как для атрибута вы создаёте производный класс, то что мешает вместо атрибута сразу прописать инициализацию свойства нужным значением? Всё равно по факту получается вы для каждого значения создаёте новый класс.
0
|
|||||||
|
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
|
||
| 05.02.2023, 16:58 [ТС] | ||
|
0
|
||
|
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
|
|
| 05.02.2023, 17:37 [ТС] | |
|
Элд Хасп, чето и я путаться начал. Есть зааттрибученый класс, который этот аттрибут еще и наследует.
Если я создаю экземпляр этого класса это один класс, значения в котором стоят по дефолту. Если я получаю аттрибут этого класса - то это другой класс. Я хочу сделать так, что бы значения второго класса, который атрибут, загонялись в первый, который наследует этот атрибут Добавлено через 1 минуту Элд Хасп, аттрибут нужен потому что я так захотел , я хочу что бы свойства класса инициализировались через атрибут.Добавлено через 2 минуты Я создаю класс, наследую от базового класса, а в атрибут пихаю какие то параметры Добавлено через 9 минут Посколько первый и второй класс это разные экземпляры, а первый наследует второй то я думал что есть простой способ автоматически задать свойства задать свойства в первом классе свойствами второго
0
|
|
|
Модератор
|
||||||||||||
| 05.02.2023, 18:10 | ||||||||||||
|
А свойства это часть экземпляра. Условно, для упрощения, можно считать атрибуты статическими полями только для чтения. И как они связаны с значениями свойствами экземпляра? Да ещё разных экземпляров, и разных типов.... Вы решаете какую-то специфическую задачу. Наверное решаете её давно и вам кажется что ваши объяснения достаточны. Но со стороны, без обид, эти объяснения выглядит просто как набор слов. Вот есть классы:
0
|
||||||||||||
|
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
|
||||||
| 05.02.2023, 20:42 [ТС] | ||||||
|
Элд Хасп,
Я хочу что бы унаследованный base.Name у класса Two был инициализирован атрибутов Добавлено через 1 час 0 минут инициализирован атрибутоМ Добавлено через 34 минуты Я вообще то это реализовал, в исходнике в третьем посте, через GetProperties, ищу по имени и SetValue
0
|
||||||
|
Модератор
|
|||||||
| 05.02.2023, 20:57 | |||||||
|
Я никак не могу понять ЗАЧЕМ?.Допустим, в этом примере можно сделать:
Что такое даёт вам атрибут сверх такого подхода? Работа с атрибута значительно сложнее, раз вы пошли на эти сложности, то, наверное, чем-то они оправданы. Вот это я и пытаюсь понять. Добавлено через 48 секунд Или это просто "учебная хотелка" не имеющая практического смысла?
0
|
|||||||
|
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
|
|
| 05.02.2023, 21:42 [ТС] | |
|
Элд Хасп, я бы выразился по другому, атрибут тут просто бессмысленный
, и это не учебная хотелка, это просто хотелка, я так хочу, через атрибут красивее выглядит, тем более на ход выполнения это никак не влияет, сложнее только в инициализации
0
|
|
| 05.02.2023, 21:42 | |
|
Помогаю со студенческими работами здесь
15
В чём различия между экземплярами класса и типами? Как передать параметры из одного класса в другой? Объявить новый объект класса и передать в него параметры с this Как передать параметры конструктора одного класса другому? Нужно из класса наследника передать параметры в класс родителя Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
|
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|