2016-03-24 7 views
-2

Я нашел следующий фрагмент кода, который озадачил меня.C# - наследование + отражение - как не клонировать объект

public class Bclass : Aclass 
{ 
    public const BindingFlags Flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; 

    public Bclass(IAclass a) : base(string.Empty) 
    { 
     var destFields = this.GetType().BaseType.GetFields(Flags); 

     a.GetType().GetFields(Flags).Where(x => destFields.Contains(x)).ToList().ForEach(property => 
     { 
      destFields.First(x => x == property).SetValue(this, property.GetValue(a)); 
     }); 

     var destProperties = this.GetType().BaseType.GetProperties(Flags); 

     a.GetType().GetProperties(Flags).Where(x => destProperties.Contains(x)).ToList().ForEach(property => 
     { 
      destProperties.First(x => x == property).SetValue(this, property.GetValue(a, null)); 
     }); 
    } 
    // some more methods... 
} 

Мой главный Q является .... почему бы кто-то думает, что делать ... Какая польза (ы) может выйти из этого кода.

+2

Это похоже на * действительно, действительно * плохо реализованный квантованный клоун от 'a' в новый экземпляр , Это выглядит ужасно и очень неэффективно –

+0

Protip: используйте AutoMapper. – leppie

+0

Зачем кому-то заниматься? Копировать поля? Или этот ужасный код вообще? На мой взгляд, рефлексия обычно является плохим вызовом в конструкторах. Вы спрашиваете о преимуществах, но против чего? Пожалуйста, уточните, что вы хотите от этого. –

ответ

5

Что он делает: почленно клон из a в текущий вновь созданного экземпляра

Преимущества:

  • останавливает ваш процессор становится слишком холодно, убедившись, что она использует максимальные циклы процессора, чтобы сделать что-то простой
  • он хранит GC на своих пальцах ног, делая большое количество выделения в простом объектном конструкторе без каких-либо из этих сумасшедших идей, таких как стратегические тайники
  • it ki nda снижает потребность в написании кода «копировать членов» вручную, но: есть инструменты, которые делают это очень хорошо и очень эффективно, что должно быть использовано; или если это не вариант, есть еще много способов улучшить этот код, не делая его безумно сложным.
+0

И можете ли какие-либо личные данные объекта 'a' подвергаться через создание B здесь? – davidhadas

+0

@ davidhadas из-за 'BindingFlags.NonPublic', который говорит API отражения, чтобы пик за обложками –

+0

Но поскольку вы делаете это в базовом классе ..... вы не получите доступ к личным данным в соответствии с что я читал. В противном случае большой nono для C# – davidhadas

Смежные вопросы