![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| lam0x7C4 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 1.6.2007 Где: Киев Репутация: 1 Всего: 1 |
Всем привет!
Такая вот ситуацыя: на свой страх и риск нужно сделать метод, который может клонировать произвольный об"ект, используя рефлекшн. Клон должен иметь такие же значения значимых свойств и так же реагировать на события, как и оригинал. Все вроде бы ничего, но никак не получаться клонировать события.
п.с. только ради Бога, не надо тут начинать, что клонировать об"ект - ето типа нехорошо, не по фен-шую, и т.д. й т.п. Сам знаю п.п.с. заранее пасиба. |
|||
|
||||
| Zakonnic |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 25.4.2006 Репутация: 2 Всего: 6 |
Вообще-то предложеным способом вы клонируете тип, а не объект. Соответственно обработчиков в ивенты не может быть записано. Они пишутся на этапе выполнения кода, то есть создания экземпляра типа и его работы.
--------------------
...и никогда не пишите в комментариях правду |
|||
|
||||
| altarvic |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 2.3.2007 Репутация: 1 Всего: 1 |
Object.MemberwiseClone ?
|
|||
|
||||
| Ctrl |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.2.2008 Где: Tula Репутация: 6 Всего: 7 |
Интересный вопрос!!
2 Zakonnic: все нормально - человек делает то, что делает 2 altarvic: В принципе все верно: Object.MemberwiseClone создаст так называемую Shallow-копию твоего объекта, т.е. склонирует его поля (Это важно!!!) - а так как по-большому счету эвент - это замаскированый референс на экземпляр класса, производного от MulticastDelegate, то при клонировании этим методом в клоне мы получим ссылку на тот же экземпляр, и соответственно на те-же Добавлено через 1 минуту и 33 секунды обработчики все остальное хм... надо бы эту идею подкрепить тестами |
|||
|
||||
| Ctrl |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.2.2008 Где: Tula Репутация: 6 Всего: 7 |
Ага, все работает. Вот тестовое приложение (Куда брейкпоинты ставить надеюсь понятно)
|
|||
|
||||
| Zakonnic |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 25.4.2006 Репутация: 2 Всего: 6 |
Человек использует рефлекшн, чтобы клонировать объект, который уже прошел инициализацию, пожил и поработал. Мембервайз клоун работает - это понятно. Вы тогда уж приведите пример, как через obj.GetType().GetEvents() и все остальное можно получить клон объекта, а не типа ;) PS. А рефлекшном рекомендовал бы проверять объекты на принадлежность ICloneable и если что - использовать их родной метод Clone(). --------------------
...и никогда не пишите в комментариях правду |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
||||
|
||||
| Ctrl |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.2.2008 Где: Tula Репутация: 6 Всего: 7 |
Вот пример клонирования всех "простых" евентов объекта через "obj.GetType().GetEvents() и все остальное"... эт на случай если нету у объекта реализации ICloneable или чего-то подобного. (MemberviseClone в этом случае тоже просто так не прокатит).
Идея: для клонирования всего объекта надо дернуть клонирование всех его полей... Такое клонирование - операция медленная но, если грамотно закешировать Reflection-вызовы ... скорость получится очень хорошая (ненамного медленнее прямого копирования полей в реализации ICloneable.Clone)
|
|||
|
||||
| altarvic |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 2.3.2007 Репутация: 1 Всего: 1 |
а если нет полей для эвентов? допустим они хранятся в хеш-таблице?
К тому же этот вариант будет работать если наименования полей совпадают с наименованием событий, (сейчас в C# так, но хз как в других языках) В общем случае нет такого алгоритма, только частные случаи (чем не нравится MemberwiseClone ? Все тоже самое только одной строчкой)
Это сообщение отредактировал(а) altarvic - 4.7.2008, 07:54 |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |