2016-03-08 3 views
1

Это просто вопрос «из любопытства», поэтому я не могу представить пример реального мира, основанный на текущей проблеме, но достаточно небольшого фиктивного кода. Мне интересно, если есть прямой (и особенно быстрый) способ сопоставить экземпляр объекта с «этим» (текущий экземпляр того же типа, с доступом к частным членам и т. Д.)Экземпляр объекта объекта для 'этого'?

Все примеры и практические рекомендации, которые я видел, используют чрезмерное использование отражения, даже наращивая полные деревья выражений или используя фреймворки, такие как Automapper, все с их собственными ограничениями, когда идея кажется «довольно тривиальной». Почему просто невозможно скопировать все указатели/ссылки и т. Д. Из одного места в память в другое, учитывая, что выделенное пространство и т. Д. Точно такое же?

+0

вы можете клонировать его, используя ISerializable –

+0

Поскольку «копирование» является целым ореолом более сложным, чем вы предполагаете. Предположим, что класс имеет поле типа List. Вы копируете ссылку или создаете новый список и копируете в него элементы? И если вы делаете последнее, копируете ли ссылки на предметы или объекты, которые нужно скопировать, также нужно скопировать? Что должно произойти с их полями? Что делать, если у вас недостаточно доступа, чтобы сделать это правильно? Попробуйте решить эту проблему на этом языке, и вы получите франкэнязык C++. –

ответ

1

AFAIK, нет прямого способа сделать это для собственного экземпляра (этого). И я полагаю, что копирование данных из другого экземпляра в это было бы достаточно. Что может быть альтернативой для вас, это работа со статическим экземпляром, но это имеет некоторые особенности, если вам нужно работать с более чем одним экземпляром.

public class MyObject { 


    private static MyObject _instance; 

    public static MyObject Instance 
    { 
     get { return _instance; } 
     set { _instance = value; } 
    } } 

PS: Я написал этот пост с моей камеры, так что простите меня, если вы столкнетесь с небольшими ошибками, так как я не был в состоянии проверить его перед отправкой. Я обновлю сообщение, как только смогу проверить код.

1

Если это возможно, вы просто ссылаетесь на other на новую ссылку, но не копируете ее содержимое в новый экземпляр MyObject. Таким образом, ваш конструктор просто вернет новую ссылку на уже существующий экземпляр. Вам нужен совершенно новый экземпляр MyObject, не так ли? Поэтому вам нужно создать один из них, используя один из его конструкторов. Если у вас есть копия-конструктор, который достигает этой цели you're штраф:

public class MyObject { 
    public MyObject(MyObject other) { 
     this.Prop1 = other.Prop1; 
    } 
} 

Конечно, есть некоторые короче (но не neccesarily заставки) appraoches - например, используя отражение и просто копировать все значения свойств из одного экземпляра в другой. Однако в основном вы все-таки создаете совершенно новый экземпляр, настроив его членов соответствующим образом.

Отражение-код может выглядеть следующим образом:

public class MyObject { 
    public MyObject(MyObject other) { 
     var props = typeof(MyObject).GetProperties(); 
     foreach(var p in props) 
     { 
      p.SetValue(this, p.GetValue(other)); 
     } 
    } 
} 

Однако это относится только к государственной собственности, вы должны сделать это с полями и частными или внутренних элементов также.

+0

Если мне понадобится совершенно новый экземпляр, я думаю, зависит от прецедента. Предположим, у меня есть система конфигурации на основе сильно типизированной модели конфигурации, которая десериализуется из базового поставщика/сериализатора. Тогда я бы хотел, чтобы возвращаемый экземпляр из сериализатора фактически был текущим экземпляром. Однако, например, DTO/PTO и т. Д., Я ожидаю, что экземпляр будет скопирован. – artganify

+0

Итак, если у вас уже есть ссылка на ваш экземпляр и вы не хотите его копировать, почему бы просто не использовать эту ссылку? – HimBromBeere

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