Заполните класс, используя почти идентичные данные класса

87
8

У меня есть два класса, которые должны быть точно такими же, кроме одного класса необходимо другое свойство.

Вместо того, чтобы переписывать все свойства дважды, я подумал о наследовании всех свойств от 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;

Есть ли способ быстро заполнить класс, используя другой класс, который имеет одно свойство меньше?

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

Заранее благодарю за любую помощь.

спросил(а) 2021-01-19T19:22:45+03:00 2 месяца, 3 недели назад
1
Решение
98

Не каждый фрукт является яблоком, поэтому с точки зрения компилятора не каждый 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;

ответил(а) 2021-01-19T19:22:45+03:00 2 месяца, 3 недели назад
44

"Я уже заполнил все детали для исходного BaseClass в моей функции"
Итак, если у вас есть func как

void your_func_fill(BaseClass _BaseClass)

Вы можете просто вызвать эту функцию с дочерним классом объекта

MyNewClass _MyNewClass;

...

your_func_fill(_MyNewClass)

Удачи!

ответил(а) 2021-01-19T19:22:45+03:00 2 месяца, 3 недели назад
44

Если у вас много свойств и вы не хотите вручную устанавливать каждое из них, я советую вам повторить их

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; }
}

ответил(а) 2021-01-19T19:22:45+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема