У меня есть два класса C #, которые имеют много одинаковых свойств (по имени и типу).Я хочу иметь возможность скопировать все ненулевые значения из экземпляра Defect
в экземпляр DefectViewModel
.Я надеялся сделать это с отражением, используя GetType().GetProperties()
.Я попробовал следующее:
var defect = new Defect();
var defectViewModel = new DefectViewModel();
PropertyInfo[] defectProperties = defect.GetType().GetProperties();
IEnumerable<string> viewModelPropertyNames =
defectViewModel.GetType().GetProperties().Select(property => property.Name);
IEnumerable<PropertyInfo> propertiesToCopy =
defectProperties.Where(defectProperty =>
viewModelPropertyNames.Contains(defectProperty.Name)
);
foreach (PropertyInfo defectProperty in propertiesToCopy)
{
var defectValue = defectProperty.GetValue(defect, null) as string;
if (null == defectValue)
{
continue;
}
// "System.Reflection.TargetException: Object does not match target type":
defectProperty.SetValue(viewModel, defectValue, null);
}
Каков наилучший способ сделать это?Должен ли я вести отдельные списки Defect
свойств и DefectViewModel
свойств, чтобы я мог viewModelProperty.SetValue(viewModel, defectValue, null)
?
Редактировать: благодаря обоим Иордана и Дейв отвечает, я выбрал AutoMapper.DefectViewModel
находится в приложении WPF, поэтому я добавил следующий конструктор App
:
public App()
{
Mapper.CreateMap<Defect, DefectViewModel>()
.ForMember("PropertyOnlyInViewModel", options => options.Ignore())
.ForMember("AnotherPropertyOnlyInViewModel", options => options.Ignore())
.ForAllMembers(memberConfigExpr =>
memberConfigExpr.Condition(resContext =>
resContext.SourceType.Equals(typeof(string)) &&
!resContext.IsSourceValueNull
)
);
}
Затем, вместо всего этого PropertyInfo
бизнеса, у меня просто есть следующая строка:
var defect = new Defect();
var defectViewModel = new DefectViewModel();
Mapper.Map<Defect, DefectViewModel>(defect, defectViewModel);