У меня есть требование скопировать только заполненные значения из одного объекта, которые еще не заполнены другим объектом того же типа.Копировать ТОЛЬКО заполненные значения из одного объекта, которые еще не заполнены другим объектом того же типа
Например, нам передан объект, он частично создается экземплярами данных, мы читаем базу данных, чтобы получить полностью экземплярную версию объекта - однако это может не иметь изменений приложением, переданным в базу данных еще - следовательно нам нужно перенести любые значения из версии базы данных в переданную в версии объекта - без перезаписи каких-либо значений, которые могут уже существовать в переданном объекте (так как это самые последние значения).
Код, предложенный Адамом Робинсоном в другом сообщении (см. Ниже, очень полезен - спасибо!) Является хорошей отправной точкой. Однако мне нужно расширить это, поскольку я хочу только скопировать значения, которые еще не заполнены целевым объектом (т. Е. Нужно проверить, что destProperty не является нулевым). Однако, как добавленное усложнение, внутри объекта передаются внутренние сложные типы, этот код копирует подгруппы высокого уровня, не вдаваясь в индивидуальные свойства подгрупп (т.е. любые переменные, объявленные с корневым cdt, я могу попробовать и проверьте значение null, но все поля в sub cdts просто копируются без прохождения отдельных полей).
Любая помощь была бы принята с благодарностью.
public static void CopyPropertyValues(object source, object destination)
{
var destProperties = destination.GetType().GetProperties();
foreach (var sourceProperty in source.GetType().GetProperties())
{
foreach (var destProperty in destProperties)
{
if (destProperty.Name == sourceProperty.Name &&
destProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType))
{
destProperty.SetValue(destination, sourceProperty.GetValue(
source, new object[] { }), new object[] { });
break;
}
}
}
}
Являются ли «источник» и «пункт назначения» того же класса или возможно, что они будут отличаться? Являются ли они объектами в Entity Framework? –
Источник и назначение одного класса, они не должны отличаться! Благодаря! – user2026086
Я бы отфильтровал ваши свойства следующим образом: '.GetProperties(). Где (свойство => property.CanRead && property.CanWrite)'. В противном случае вы можете попытаться прочитать свойства только для установки или написать свойства get-only. – dcastro