Ответ 1
Нет ничего в каркасе для сопоставления объектных объектов, но там есть очень популярная библиотека, которая делает это: AutoMapper.
AutoMapper - это простая небольшая библиотека, созданная для обманчивой сложная проблема - избавление от кода, который сопоставил один объект с другой. Этот тип кода довольно скучный и скучный для написания, поэтому почему бы не придумать инструмент для этого?
Кстати, просто для обучения, вот простой способ реализовать то, что вы хотите. Я не тестировал его полностью, и он нигде не является надежным/гибким/исполненным как AutoMapper, но, надеюсь, есть что-то, чтобы выбраться из общей идеи:
public void CopyTo(this object source, object target)
{
// Argument-checking here...
// Collect compatible properties and source values
var tuples = from sourceProperty in source.GetType().GetProperties()
join targetProperty in target.GetType().GetProperties()
on sourceProperty.Name
equals targetProperty.Name
// Exclude indexers
where !sourceProperty.GetIndexParameters().Any()
&& !targetProperty.GetIndexParameters().Any()
// Must be able to read from source and write to target.
where sourceProperty.CanRead && targetProperty.CanWrite
// Property types must be compatible.
where targetProperty.PropertyType
.IsAssignableFrom(sourceProperty.PropertyType)
select new
{
Value = sourceProperty.GetValue(source, null),
Property = targetProperty
};
// Copy values over to target.
foreach (var valuePropertyTuple in tuples)
{
valuePropertyTuple.Property
.SetValue(target, valuePropertyTuple.Value, null);
}
}