Как скопировать значения одного класса в другой, не меняя их мест в памяти - PullRequest
0 голосов
/ 28 апреля 2020

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

 class PersonData
    {
        public string PersonName;
        public int age;

        public PersonData(string name, int age)
        {
            this.age = age;
            PersonName = name;
        }
    }
    class Program
    {

        static void Main(string[] args)
        {
            object person1 = new PersonData("FirstPerson",20);
            object person2 = new PersonData("secondPerson",30);

            person1 = person2;
        }
    }

person1 начнет указывать на ячейку памяти person2 , то, что я хотел бы сделать, просто скопировать ЗНАЧЕНИЯ person2 в ячейку памяти person1. есть ли другой метод, кроме

person1.age = person2.age;
person1.name = person2.name;

, потому что я заранее не знаю полей объекта.

заранее благодарю.

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Использование deep copy,

Deep copy создаст экземпляр и скопирует значение в собственную область памяти.

. Net есть много способов сделать это.

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

Пример кода (используйте пакет Newtonsoft.Json):

 class PersonData
    {
        public string PersonName;
        public int age;

        public PersonData(string name, int age)
        {
            this.age = age;
            PersonName = name;
        }
    }
    class Program
    {

        static void Main(string[] args)
        {
            object person1 = new PersonData("FirstPerson",20);
            object person2 = new PersonData("secondPerson",30);

            //First ,serialize the object, then copy to other object with deserialize
            person2 = JsonConvert.DeserializeObject<Person>(JsonConvert.SerializeObject(source));
        }
    }
0 голосов
/ 28 апреля 2020

Все объекты имеют защищенную функцию MemberwiseClone, которая делает поверхностную копию членов класса. Обычно это раскрывается через реализацию интерфейса ICloneable. Однако убедитесь, что вы понимаете, что означает мелкая копия. Для переменных-членов типа значения он копирует значения. Для переменных-членов ссылочного типа он копирует ссылку.

public class PersonData : ICloneable {
    public string PersonName;
    public int age;

    public PersonData(string name, int age)
    {
        this.age = age;
        PersonName = name;
    }

    public object Clone() => this.MemberwiseClone();
}

class Program
{

    static void Main(string[] args)
    {
        object person1 = new PersonData("FirstPerson",20);
        object person2 = new PersonData("secondPerson",30);

        person1 = person2.Clone();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...