Скопировать класс в другого?

Я имею

class A
{
    public int a;
    public string b;
}

Как я могу скопировать в другой A? В C++ я знаю, что мог сделать *a1 = *a2;. Действительно ли там что-то подобно в C#? Я знаю, что мог записать универсальное решение с помощью отражения, но я надеюсь, что что-то уже существует.

Я рассматриваю изменение к nullable структуре.

Шаг 2 я должен буду сделать

class B : A {}
class C : A {}

и скопируйте базовые данные от B до C.

8
задан 14 January 2010 в 22:11
поделиться

8 ответов

Вот какой-то простой код, который работает на любом классе, а не только на базе.

    public static void DuckCopyShallow(this Object dst, object src)
    {
        var srcT = src.GetType();
        var dstT= dst.GetType();
        foreach(var f in srcT.GetFields())
        {
            var dstF = dstT.GetField(f.Name);
            if (dstF == null)
                continue;
            dstF.SetValue(dst, f.GetValue(src));
        }

        foreach (var f in srcT.GetProperties())
        {
            var dstF = dstT.GetProperty(f.Name);
            if (dstF == null)
                continue;

            dstF.SetValue(dst, f.GetValue(src, null), null);
        }
    }
7
ответ дан 5 December 2019 в 05:26
поделиться

я использовал двоичную сериализацию. В основном сериализируйте экземпляр к потоку памяти. Затем десериализуйте его из потока памяти. У вас будет точная двоичная копия. Это будет глубокая копия, а не мелкая копия.

class a = new ClassA();

class b = MySerializationMethod(a);

Для мелкой копии можно использовать Объект. MemberwiseClone

8
ответ дан 5 December 2019 в 05:26
поделиться

Предполагая, что является просто простым классом, вы можете сделать

A newA = instanceOfA.MemberwiseClone();

MembleWiseClone () - это неглубокому копию, хотя, поэтому, если ваш класс становится сложным, со свойствами, которые также являются типовыми типами, это не будет работать для вас.

-121--3448157-

Существует Iclonable интерфейс , который предлагает метод клона () .

клон на MSDN.

3
ответ дан 5 December 2019 в 05:26
поделиться

Вы можете клонировать, вы можете определить конструктор копирования. Зачем изменить класс для структуры только потому, что в C ++ вы можете сделать что-то в 10 символах. C # другой. Структы имеют преимущества и недостатки.

0
ответ дан 5 December 2019 в 05:26
поделиться

При условии, что это просто простой класс , вы можете сделать

A newA = instanceOfA.MemberwiseClone();

MemberWiseclone () - это неглубокая копия, поэтому, если ваш класс становится сложным, со свойствами, которые также являются типовыми типами, это не будет работать для вас.

4
ответ дан 5 December 2019 в 05:26
поделиться

Мы использовали этот код успешно:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace Utility {
    internal static class ObjectCloner {
        public static T Clone<T>(T obj) {
            using (MemoryStream buffer = new MemoryStream()) {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(buffer, obj);
                buffer.Position = 0;
                T temp = (T)formatter.Deserialize(buffer);
                return temp;
            }
        }
    }
}

могут быть другие методы, которые работают лучше, но, возможно, это поможет вам

Крис

2
ответ дан 5 December 2019 в 05:26
поделиться

Добавьте соответствующие конструкторы:

class Foo
{
    public Foo(int a, string b)
    {
        A = a;
        B = b;
    }

    public Foo(Foo other)
    {
        A = other.A;
        B = other.B;
    }

    public int A { get; set; }
    public string B { get; set; }
}

Вы также должны подумать о том, чтобы сделать его неизменностью, особенно если вы рассматриваете, что вступите в структуру. Союзные структуры злые.

Наконец, когда вы унаследовали от класса, вам не нужно копировать участников из базового класса в подкласс.

3
ответ дан 5 December 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: