Каким будет лучший способ написать универсальную функцию конструктора экземпляра для моих классов С#? Они все наследуют от абстрактного базового класса, поэтому я могу использовать отражение для сопоставления свойств, но мне интересно, есть ли лучший способ?
Generic С# Copy Constructor
Ответ 1
Вы можете создать мелкую копию эффективно с отражением, предварительно скомпилировав ее, например, с помощью Expression
. Например, как это.
Для глубоких копий сериализация является наиболее надежным подходом.
Ответ 2
Конструктор копирования в основном означает, что у вас есть один параметр, который является объектом, который вы собираетесь копировать.
Также сделайте глубокую копию, а не мелкую копию.
Если вы не знаете, что такое глубокие и мелкие копии, то вот сделка:
Предположим, что вы копируете класс с одной строкой целых чисел в качестве поля.
Неглубокая копия будет:
public class Myclass()
{
private int[] row;
public MyClass(MyClass class)
{
this.row = class.row
}
}
глубокая копия:
public class Myclass()
{
private int[] row;
public MyClass(MyClass class)
{
for(int i = 0; i<class.row.Length;i++)
{
this.row[i] = class.row[i];
}
}
}
Глубокая копия действительно получает значения actall и помещает их в новое поле нового объекта, в то время как мелкая копия копирует только указатели.
С мелкой копией, если вы установили:
row[3] = 5;
И затем напечатайте обе строки, обе печати будут иметь 5 в качестве значения 4-го числа. Однако с глубокой копией только первая печать будет иметь это, так как строки не имеют одинаковых указателей.
Ответ 3
Избегайте отражения, если можете. Каждый класс должен нести ответственность за копирование своих собственных свойств и отправить его далее базовому методу.
Ответ 4
Вот конструктор, который я использую. Обратите внимание, что это мелкий конструктор и довольно упрощен, из-за характера моего базового класса. Должно быть достаточно хорошо, чтобы вы начали.
public partial class LocationView : Location
{
public LocationView() {}
// base class copy constructor
public LocationView(Location value) {
Type t = typeof(Location);
PropertyInfo[] properties = t.GetProperties();
foreach (PropertyInfo pi in properties)
{
pi.SetValue(this, pi.GetValue(value, null), null);
}
}
public Quote Quote { get; set; }
}
Ответ 5
Вы можете ссылаться на valueinjecter и ускорять выбор пакетов nuget и использовать:
public class Myclass()
{
private string _property;
public MyClass(MyClass obj)
{
this.InjectFrom(obj.DeepClone());
}
}