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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2012, 12:56   #1
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию Копирование свойств объекта

Имеется 2 объекта одного типа, возникла необходимость скопировать все свойства одного объекта в другой.
Приведенный ниже код работает, но не копируются коллекции. Возможно ли встроить сюда копирование свойств вложенных классов и коллекций?
Код:
private void CopyProperty(object from, object to)
{
      foreach (System.Reflection.PropertyInfo info in from.GetType().GetProperties())
      {
          try
          {
              if (info.CanWrite)
              {
                  to.GetType().GetProperty(info.Name).SetValue(to, info.GetValue(from, null), null);
              }
          }
          catch
          { }
      }
}
И еще, если to == null возникают проблемы, как сюда встроить создание объекта to.
Нужно что-то вроде
Код:
  if (to == null)
          to = new from.Type(); //или typeof(from)
ну а это как понимаете не работает
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.

Последний раз редактировалось mrChester; 13.02.2012 в 12:58.
mrChester вне форума Ответить с цитированием
Старый 13.02.2012, 21:32   #2
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Честно говоря копировать через Reflection как-то не очень. Тут есть много вариантов. Вот эти я сам иногда использую. Тебе явно подойдет 2 вариант.
1. Используя MemberwiseClone
Код:
class Person() : ICloneable
{
    public string head;
    public string feet; 

    #region ICloneable Members

    public object Clone()
    {
        return this.MemberwiseClone();
    }

    #endregion
}
2. Используя сереализацию/десереализацию:
Код:
public static T Clone<T>(T source)
    {
        if (!typeof(T).IsSerializable)
        {
            throw new ArgumentException("The type must be serializable.", "source");
        }

        // Don't serialize a null object, simply return the default for that object
        if (Object.ReferenceEquals(source, null))
        {
            return default(T);
        }

        IFormatter formatter = new BinaryFormatter();
        Stream stream = new MemoryStream();
        using (stream)
        {
            formatter.Serialize(stream, source);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }
Подробно можешь почитать тут.
Hollander вне форума Ответить с цитированием
Старый 14.02.2012, 10:55   #3
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Прошел по ссылке, посмотрел все методы создания клона объекта... Беда в том, что объект, копию которого я хочу создать не сериализуемый, это компонента от Infragistic, сделать её сериализуемой потомком класса ICloneable или еще какого-либо не представляется возможным, остается только способ использования Reflection.
Так вот этот способ и надо развить
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 14.02.2012, 11:19   #4
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Я бы предложил использовать ручное копирование, т.е. самому реализовать метод Clone. Просто я не знаю, что там за объект, но примерно так:

Код:
class Person() : ICloneable
{
    public string head;
    public string feet; 

    #region ICloneable Members

    public object Clone()
    {
        Person clone = new Person();
        clone.head = head;
        clone.feet = feet;
    }

    #endregion
}
Hollander вне форума Ответить с цитированием
Старый 14.02.2012, 12:21   #5
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Объект WorkSheet документа Excel. Нужно создать копию листа. Сам лист уже ссылается на книгу. Копия листа будет также содержаться в этой книге. Но все данные должны совпадать. Через Reflection все можно скопировать, но отдельно приходится вызывать метод для коллекций. Не получается только создать копию объектов содержащихся на листе, они содержатся в коллекции WorkSheetShapeCollection
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 14.02.2012, 13:09   #6
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Это не поможет ? http://stackoverflow.com/questions/3808368/c-sharp-how-to-copy-a-single-excel-worksheet-from-one-workbook-to-another
Hollander вне форума Ответить с цитированием
Старый 14.02.2012, 13:37   #7
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Нет, методы Interop.Excel не подходят, если бы использовалась эта библиотека, не появилось бы такой проблемы. Использую Infragistics.Excel.
Там вообще нет подобных методов, банальную вставку строки или копирование ячеек приходится реализовывать руками. При этом не забываем о форматах, таблицах, формулах. Вот и появилась эта проблема.
Пока идей о копировании вставленных рисунков и диаграмм при копировании листов нет.
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 16.02.2012, 16:28   #8
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Связался с техподдержкой Infragistics, проблема не решаемая. Обещали в будущих версиях предусмотреть
Думаю тему можно закрыть
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение свойств объекта не активируя его ndvikulov Microsoft Office Excel 16 16.09.2010 20:14
Cкрипт с использованием объекта layer, его свойств и методов Zempery JavaScript, Ajax 0 05.04.2010 12:09
Cкрипт с использованием объекта layer, его свойств и методов Zempery Помощь студентам 0 05.04.2010 11:41
Изменение свойств объекта во время выполнения процедуры Gypsy Общие вопросы Delphi 4 28.12.2009 11:49
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37