Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2009, 14:32   #1
Chor
Новичок
Джуниор
 
Регистрация: 10.06.2009
Сообщений: 5
По умолчанию Глубокое копирование

не подскажете какие есть способы скопировать объект. Точнее сделать глубокую копию (вместе со всеми ссылочными типами). Может есть какой-то стандартный метод типа MemberwiseClone()?
Chor вне форума Ответить с цитированием
Старый 10.06.2009, 15:33   #2
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Я обычно делаю так:
Код:
class MyClass
{
int a;

public MyClass()
{
}

public static MyClass Clone(MyClass obj)
{
  MyClass myClass = new MyClass();
  myClass.a = obj.a;
  return myClass;
}

}
А где надо вызываешь:

Код:
MyClass myClass = MyClass.Clone(myClass1);
Hollander вне форума Ответить с цитированием
Старый 11.06.2009, 04:11   #3
Chor
Новичок
Джуниор
 
Регистрация: 10.06.2009
Сообщений: 5
По умолчанию

Спасибо, я поискал нашел еще пару интересных вариантов. Больше всего понравился этот
Код:
private T CreateShallowCopy<T>(T o)
        {
            // Поверхностное клонирование.
            MethodInfo memberwiseClone = o.GetType().GetMethod("MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic);

            // Вызов метода MemberwiseClone из-под объекта o.
            return (T)memberwiseClone.Invoke(o, null);
        }

        private T CreateDeepCopy<T>(T o)
        {
            // Создаем поверхостную копию.
            T copy = CreateShallowCopy(o);

            // Получем массив объектов FieldInfo и проходим по всем полям.
            foreach (FieldInfo f in typeof(T).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
            {
                // Получаем значение хранящееся в поле класса.
                object original = f.GetValue(o);

                // Устанавливаем значение в поле объекта copy cо значением которое будет установлено с помощью рекурсивного вызова метода.
                f.SetValue(copy, CreateDeepCopy(original));
            }
            return copy;
        }
Через дженерики и рекурсию %)

тут еще есть примеры http://forum.cbsystematics.com/showt...E2%E0%ED%E8%E5
Chor вне форума Ответить с цитированием
Старый 11.06.2009, 09:30   #4
atomicxp
Форумчанин
 
Аватар для atomicxp
 
Регистрация: 01.05.2009
Сообщений: 110
По умолчанию

Для этого надо использовать IClonable. В таких вопросах лучше не изобретать велосипеды (хотя лично я это очень люблю ), а придерживаться стандартных интерфейсов, так как на них часто завязана реализация вплоть до инструкций самого языка.
atomicxp вне форума Ответить с цитированием
Старый 11.06.2009, 20:03   #5
Chor
Новичок
Джуниор
 
Регистрация: 10.06.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от atomicxp Посмотреть сообщение
Для этого надо использовать IClonable. В таких вопросах лучше не изобретать велосипеды (хотя лично я это очень люблю ), а придерживаться стандартных интерфейсов, так как на них часто завязана реализация вплоть до инструкций самого языка.
Согласен лучше использовать стандартные интерфейсы, просто реализация упомянутая выше хорошо подойдет под метод Clone().
Chor вне форума Ответить с цитированием
Старый 11.06.2009, 20:59   #6
atomicxp
Форумчанин
 
Аватар для atomicxp
 
Регистрация: 01.05.2009
Сообщений: 110
По умолчанию

Это как сказать.
atomicxp вне форума Ответить с цитированием
Старый 12.06.2009, 01:19   #7
Chor
Новичок
Джуниор
 
Регистрация: 10.06.2009
Сообщений: 5
По умолчанию

Мне подошло главное что глубокое копирование работает.
Chor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование файлов Demien Общие вопросы Delphi 9 26.03.2010 08:52
Копирование Image mustang007 Компоненты Delphi 3 10.06.2009 22:21
Копирование VVVasek Microsoft Office Excel 13 20.09.2008 23:12
Копирование ryton SQL, базы данных 2 30.06.2008 09:32
Hook на копирование. Dj_smart Win Api 4 26.05.2008 00:22