1. C# / Говнокод #13301

    +130

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    public object Clone()
    {
    	using (MemoryStream stream = new MemoryStream())
    	{
    		BinaryFormatter formatter = new BinaryFormatter();
    		formatter.Serialize(stream, this);
    		stream.Position = 0;
    		ColLink result = (ColLink)formatter.Deserialize(stream);
    		result.Id = IdentityManager.GetId();
    		result.GUID = Guid.NewGuid();
    		result.setEdited();
    		result.setCreated();
    		return result;
    	}
    }

    Клонирование

    Запостил: dormendo, 04 Июля 2013

    Комментарии (18) RSS

    • Я думаю через рефлексию децл быстрее будет, нежели ещё и AssemblyName парсить...
      void CopyProperties<S,T>(S source, T target) where T : class
      {
      	if(source == null) throw new ArgumentNullException("source");
      	if(target == null) throw new ArgumentNullException("target");
      
      	Type type = typeof(T);
      	PropertyInfo[] properties = source.GetType().GetProperties();
      	foreach(PropertyInfo property in properties)
      	{
      		PropertyInfo targetProperty = type.GetProperty(property.Name);
      		if(targetProperty != null)
      			targetProperty.SetValue(target, property.GetValue(source, null), null);
      	}
      }

      Ну и расширить ещё:
      IEnumerable<T> CopyProperties<S,T>(IEnumerable<S> source) where T : class, new()
      {
      	if(source == null) throw new ArgumentNullException("source");
      
      	foreach(S src in source)
      	{
      		T result=new T();
      		CopyProperties(src, result);
      		yield return result;
      	}
      }
      Ответить
      • На мой взгляд, WCF-сервис клонирования будет поинтереснее.
        Ответить
        • С basicHttpBinding? Ага, должно быть весело.
          А для того чтобы не загружать сеть направить его через loopback.
          Ответить
          • netMsmqBinding лучше. Всё-таки нагрузка на сервис должна быть под контролем.
            Ответить
      • То есть поля идут лесом, свойства-массивы идут лесом, свойства-сложные типы идут лесом...

        Именно этот код следует публиковать как ГК.
        Ответить
        • Если объект типа Entity, LINQ to SQL или входящие параметры для WS/WCF, то сойдёт.
          В противном случае если-бы он делал полный клон, то его стоило-бы назвать DeepClone.

          А полный клон, ага, лучше делать через бинарную сериализацию.
          В таком случае хоть код и будет красивый, но вот с производительностью будет не очень...

          Соответственно, если копировать по полям, то можно пропустить исключение валидации в пропертях.
          Ну и лучше чем:
          class SomeData {
          public String Property1 {get;set;}
          ...
          }
          class AnoterData {
          public String Property1 {get;set;}
          ...
          }
          var a=new SomeData() { ...};
          var b=new AnoterData();
          b.Propery1=a.Property1;

          И так ещё 100500 свойств...
          Ответить
          • > В противном случае если-бы он делал полный клон, то его стоило-бы назвать DeepClone

            Клонирование оно и есть клонирование.
            Для поверхностного копирования (shallow copy) есть специальный метод - MemberwiseClone. А все велосипеды идут на юх.
            Все велосипедисты идут читать документацию.
            Ответить
            • Кэп, ты ведь за конструкторы копирования, как и я, да?
              Ответить
            • При чём тут MemberwiseClone? С таким успехом ещё и StringBuilder можно вспомнить.
              Ответить
          • Любая автоматизация - это утрата контроля и производительности.

            Кстати, бинарная сериализация жутко тормозит на этапе десериализации. На больших графах получалось даже, что сериализаторы WCF начинали выигрывать, если складывать время выполнения пары операций.
            Ответить
            • Согласен, в большинстве своём лучше такого не делать...
              Ну, можно вязть на примере (живом):
              Есть некое звено, которое использует источник данных:
              class SourceData {
                  String Property1 {get;set;}
                  String Property2 {get;set;}
              ...
              }

              Данные используются на других узлах. Затем, другая комманда сказала:
              - Мы себе тоже хотим себе такие данные при определённом событии.
              Замечательно, другая комманда написала сервис:
              class OutputData {
                  String Property1 {get;set;}
                  String Property2 {get;set;}
              }
              void TransmitData(OutputData data,...);

              Если делать так:
              void TransmitDataToServer(SourceData input)
              {
                  OutputData output=new OutputData() {
                      Property1=input.Property1,
                      Property2=input.Propertty2,
                  };
                  ...
                  _service.TransmitData(output,...);

              То при добавлении пропертей в InputData и/или в OutputData мы получим 3 места за которым придётся следить ручками (входящий набор, исходящий набор и копирование).
              Теперь вопрос: А оно надо? :)
              Ответить
              • Если не нужны тормоза, не нужны лишние сущности, не нужна возможность ненужных затрат, а нужна производительная работа, оно надо. Для однопользовательских систем, конечно, многое не нужно. Тут пойдёт и EntityFramework, и какой-нибудь Азман, и очень большое количество самых разных приблуд.
                Ответить
                • Скорее, как Вы правильно сказали, больше про автоматизацию и использование золотой середины, между праведным полным клоном и поверхностным.
                  Ответить
    • Нормальный код. Стандартный способ глубокого копирования. Быстро и просто.

      ОП - нуп. Плюсаторы - ламеры.
      Ответить
      • Наконец вижу настоящего гражданина - совестливого и неполживого. Так победимъ!
        Ответить
      • Кэп, ты забыл подписаться.

        Чет такое про яву читал. Только в фитоне у лохов deepcopy() есть.
        Ответить
    • Вы испытываете затруднения при работе за копьютером, не понимаете как что-то сделать и куда нажать? Не проблема! Вы гарантированно все поймете после просмотра простых и понятных видеокурсов от http://www.teachshop.ru/
      Ответить

    Добавить комментарий