Я имею
class A
{
public int a;
public string b;
}
Как я могу скопировать в другой A? В C++ я знаю, что мог сделать *a1 = *a2;
. Действительно ли там что-то подобно в C#? Я знаю, что мог записать универсальное решение с помощью отражения, но я надеюсь, что что-то уже существует.
Я рассматриваю изменение к nullable структуре.
Шаг 2 я должен буду сделать
class B : A {}
class C : A {}
и скопируйте базовые данные от B до C.
Вот какой-то простой код, который работает на любом классе, а не только на базе.
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);
}
}
я использовал двоичную сериализацию. В основном сериализируйте экземпляр к потоку памяти. Затем десериализуйте его из потока памяти. У вас будет точная двоичная копия. Это будет глубокая копия, а не мелкая копия.
class a = new ClassA();
class b = MySerializationMethod(a);
Для мелкой копии можно использовать Объект. MemberwiseClone
Вот - то, что кто-то уже сделал...
Глубокая Копия в C# (Клонирующийся для определяемого пользователем класса)
Предполагая, что является просто простым классом, вы можете сделать
A newA = instanceOfA.MemberwiseClone();
MembleWiseClone () - это неглубокому копию, хотя, поэтому, если ваш класс становится сложным, со свойствами, которые также являются типовыми типами, это не будет работать для вас.
-121--3448157- Существует Iclonable
интерфейс , который предлагает метод клона ()
.
Вы можете клонировать, вы можете определить конструктор копирования. Зачем изменить класс для структуры только потому, что в C ++ вы можете сделать что-то в 10 символах. C # другой. Структы имеют преимущества и недостатки.
При условии, что это просто простой класс , вы можете сделать
A newA = instanceOfA.MemberwiseClone();
MemberWiseclone () - это неглубокая копия, поэтому, если ваш класс становится сложным, со свойствами, которые также являются типовыми типами, это не будет работать для вас.
Мы использовали этот код успешно:
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;
}
}
}
}
могут быть другие методы, которые работают лучше, но, возможно, это поможет вам
Крис
Добавьте соответствующие конструкторы:
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; }
}
Вы также должны подумать о том, чтобы сделать его неизменностью, особенно если вы рассматриваете, что вступите в структуру. Союзные структуры злые.
Наконец, когда вы унаследовали от класса, вам не нужно копировать участников из базового класса в подкласс.