Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
430 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,635
Записей в блоге: 14

Ошибка при глубоком копировании через рефлексию

01.09.2021, 19:15. Показов 1238. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь реализовать глубокое копирование. Нашел в Интернете код, слегка поправил его, будто бы все логично, но для многомерного списка он не работает - выдает ошибку System.Reflection.TargetParameterCountEx ception с текстом "Parameter count mismatch.":
C#
1
2
3
4
5
6
7
8
9
10
11
12
        public static T DeepClone<T>(this T obj)
        {
            var type = obj.GetType();
            var clone = Activator.CreateInstance(type);
            var props = type.GetProperties();
            var entityPropValueDictionary = props.ToDictionary(prop => prop.Name, prop => prop.GetValue(obj)); //Тут ошибка
            foreach (var prop in props)
            {
                type.GetProperty(prop.Name).SetValue(clone, entityPropValueDictionary[prop.Name].DeepClone());
            }
            return (T)clone;
        }
В чем может быть проблема? Добавлю, что прикрутить MemberwiseClone() к списку нельзя, да и было бесполезно, так как копировало бы только одно измерение, максимум два, а у меня их может быть до ∞, бинарная сериализация устарела, а сериализация в JSON слишком расточительна.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.09.2021, 19:15
Ответы с готовыми решениями:

Ошибка при копировании через Shell link в mc
Доброго времени суток! Помогите, пожалуйста, найти решение данной проблемы: При копировании файла через Shell link соединение в...

Исключение при вывове конструктора Page через рефлексию
public class InstallerStep { ... /// &lt;summary&gt; /// Класс страницы GUI /// &lt;/summary&gt; ...

Не вызывается override метод при создании объекта через рефлексию
Воопщем у меня есть словарь, в котором записаны типы классов &lt;enum, System.Type&gt; Я по enum, чтоб не было if пытаюсь создать быстро копию...

3
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
01.09.2021, 22:12
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Добавлю, что прикрутить MemberwiseClone() к списку нельзя, да и было бесполезно
Вы уверены?
Из чего, по вашему мнению, состоит ЭКЗЕМПЛЯР?
Экземпляр состоит ТОЛЬКО ИЗ ПОЛЕЙ, которые прекрасно клонируются MemberwiseClone().

Вот пример клонирования с использованием MemberwiseClone(): Как скопировать экземпляр класса, а не присвоить ссылку?

Проблемы глубокого клонирования:
- Легко можно поймать переполнение стека при перекрёстных ссылках.
- Клонирование массивов ещё можно как-то учесть, проверяя поле на тип Array, но учесть связные списки очень сложно. Так как реализация их может очень сильно различаться и надо по коду понять как правильно клонировать элементы списка и связи между ними. Это, по сути, неразрешимая задача.

Добавлено через 6 минут
Если надо клонировать только публичные свойства и поля, то самое простое - это XML сериализация/десериализация.
И то, это возможно, если в клонируемых типах нет каких-то запрещающих атрибутов, у всех есть конструкторы по умолчанию и у свойств есть публичные сеттеры.
Бинарная сериализация, вроде делает только неглубокую копию (то есть это некий аналог MemberwiseClone()), но точно не скажу - надо проверить.
Но в любом случае, её можно применять только к сериализуемым типам.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
01.09.2021, 22:42
Если количество клонируемых типов конечно и известно, я бы либо реализовал интерфейс ICloneable, либо свой сервис который знает/умеет работать с каждым элементом.
Универсальный метод для всего и вся навряд ли получится создать.
Например Activator.CreateInstance(type) ожидает, что у типа есть конструктор без параметров (что не всегда так).
2
Эксперт .NET
 Аватар для Usaga
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,368
02.09.2021, 05:02
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
через рефлексию
А рефлексия тут обязательна? Вот прямо никак без неё? Я к тому, что какие проблемы это сделать явно, руками? Рефлексия - штука трудозатратная и к ней прибегают только в последнюю очередь.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
сериализация в JSON слишком расточительна.
Зато рефлексия экономична дальше некуда, да?)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2021, 05:02
Помогаю со студенческими работами здесь

FTP SERV-U Ошибка при копировании файла при медленном интернете
На машине на системе WIN7 стоит FTP сервер SERV-U. Другие машины используют для выхода в интернет 3G модемы, и подключаются к фтп для...

Ошибка при копировании
Ситуация такая - подключился со шлюза на котором стоит Debian к самбе с помощью Midnight Commander через Shell. Стал перекидывать архивы...

Ошибка при EOleException при копировании данных из запроса
Здравствуйте. Мне необходимо получить список ФИО всех пользователей сети(пользователей около 3000). Для этого я делаю запрос к AD. Запрос...

Ресурсозатраты при глубоком клонировании
Какие Ресурсозатраты при глубоком клонировании?

ошибка при копировании файлов
в сети с 2-х новых компов не могу скопировать и вставить ни одного файла хотя доступ на них открыт и стоит галочка &quot;резрешить...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru