Есть ли быстрый способ перенести все переменные одного идентичного объекта в другой в C #? - PullRequest
0 голосов
/ 16 ноября 2008

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

Внутри этого класса Users у меня есть метод, который создает временный объект Users, что-то делает с ним и, в случае успеха, передает все переменные из временного объекта Users в тот, который у меня есть.

Есть ли какой-нибудь быстрый способ перенести все переменные из одного объекта Users в другой объект Users, не делая этого с помощью C #?

this.FirstName = temp.FirstName;
this.LastName = temp.LastName;
........75 variables later......
this.FavoriteColor = temp.FavoriteColor

Ответы [ 5 ]

3 голосов
/ 16 ноября 2008

Вы должны проверить клонирование в C #.

Глубокое клонирование объектов

3 голосов
/ 16 ноября 2008

Лучшим подходом является реализация интерфейса IClonable. Но вы обнаружите, что это не спасает вас от большой работы.

1 голос
/ 16 ноября 2008

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

0 голосов
/ 14 июля 2011

Всегда есть опция отражения. Нечто существенно похожее на это:

public static void Copy(object source, object target)
    {
        foreach (System.Reflection.PropertyInfo pi in source.GetType().GetProperties())
        {
            System.Reflection.PropertyInfo tpi = target.GetType().GetProperty(pi.Name);
            if (tpi != null && tpi.PropertyType.IsAssignableFrom(pi.PropertyType))
            {
                tpi.SetValue(target, pi.GetValue(source, null), null);
            }

        }
    }

Не требует, чтобы источник и цель имели какое-либо отношение, просто имя и проверка IsAssignable. Это имеет интересные побочные эффекты, если вы используете ссылочные типы где-либо, но для ситуации, которую вы только что описали, это неплохой вариант для изучения.

class sourceTester
{
    public bool Hello { get; set; }
    public string World { get; set; }
    public int Foo { get; set; }
    public List<object> Bar { get; set; }
}

class targetTester
{
    public int Hello {get; set;}
    public string World { get; set; }
    public double Foo { get; set; }
    public List<object> Bar { get; set; }
}

static void Main(string[] args)
    {


        sourceTester src = new sourceTester { 
            Hello = true, 
            World = "Testing",
            Foo = 123,
            Bar = new List<object>()
        };

        targetTester tgt = new targetTester();

        Copy(src, tgt);

        //Immediate Window shows the following:
        //tgt.Hello
        //0
        //tgt.World
        //"Testing"
        //tgt.Foo
        //0.0
        //tgt.Bar
        //Count = 0
        //src.Bar.GetHashCode()
        //59129387
        //tgt.Bar.GetHashCode()
        //59129387
    }
0 голосов
/ 16 ноября 2008

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

_User = tmpUser;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...