Заполните класс, используя почти идентичные данные класса
У меня есть два класса, которые должны быть точно такими же, кроме одного класса необходимо другое свойство.
Вместо того, чтобы переписывать все свойства дважды, я подумал о наследовании всех свойств от BaseClass только с одним дополнительным свойством в MyNewClass
public class BaseClass
{
public int BaseProperty1 { get; set; }
public int BaseProperty2 { get; set; }
public int BaseProperty3 { get; set; }
}
public class MyNewClass: BaseClass
{
public int? ExtraProperty{ get; set; }
}
Поскольку я уже заполнил все детали для исходного BaseClass в своей функции, было бы гораздо проще использовать этот экземпляр класса для заполнения деталей нового экземпляра MyNewClass.
Я надеялся, что это будет так же просто, как показано ниже, но, к сожалению, я получаю ошибку: System.InvalidCastException: 'Невозможно привести объект типа' BaseClass 'к типу' MyNewClass '.'
MyNewClass myNewClass= new MyNewClass();
myNewClass = (MyNewClass)baseClass; //baseClass is alread populated at this point
myNewClass.ExtraProperty = 1;
Есть ли способ быстро заполнить класс, используя другой класс, который имеет одно свойство меньше?
Я мог бы просто установить каждое свойство индивидуально, но класс, который я использую, довольно большой, и это похоже на плохую практику.
Заранее благодарю за любую помощь.
Не каждый фрукт является яблоком, поэтому с точки зрения компилятора не каждый BaseClass
является экземпляром MyNewClass
поэтому приведение не выполняется.
Есть пара вещей, которые вы можете сделать. Например, используйте конструктор для заполнения значений:
public class MyNewClass : BaseClass
{
public int? ExtraProperty { get; set; }
public MyNewClass(BaseClass baseClass)
{
BaseProperty1 = baseClass.BaseProperty1;
BaseProperty2 = baseClass.BaseProperty2;
BaseProperty3 = baseClass.BaseProperty3;
}
}
Тогда вы можете сделать:
var myNewClass = new MyNewClass(baseClass);
myNewClass.ExtraProperty = 1;
"Я уже заполнил все детали для исходного BaseClass в моей функции"
Итак, если у вас есть func как
void your_func_fill(BaseClass _BaseClass)
Вы можете просто вызвать эту функцию с дочерним классом объекта
MyNewClass _MyNewClass;
...
your_func_fill(_MyNewClass)
Удачи!
Если у вас много свойств и вы не хотите вручную устанавливать каждое из них, я советую вам повторить их
public class MyNewClass : BaseClass
{
public MyNewClass(BaseClass seizeProperties)
{
PropertyInfo[] baseProperties = typeof(BaseClass).GetProperties();
foreach (PropertyInfo property in baseProperties)
{
property.SetValue(this, property.GetValue(seizeProperties));
}
}
public int? ExtraProperty { get; set; }
}