Некоторые предпосылки для понимания кода. У меня есть приложение MVC, все мои модели реализуют IModel. IModel просто принудительно использует свойство Id.Сравнение двух равных варов возвращает false
Следующий способ «обновляет» экземпляры модели с данными, доступными в режиме просмотра. Для каждого свойства viewmodel он проверяет, существует ли соответствующее свойство в модели, если оно оно обновляет значение в модели с параметрами модели viewmodel, если значения разные.
В последнем пункте это идет не так. Заявление: OldValue! = NewValue всегда возвращает true, даже если f.e. оба являются целыми числами, 1. Почему?
public static Boolean UpdateIfChanged<M, VM>(this M Model, VM ViewModel) where M : IModel
{
Boolean HasUpdates = false;
Type Mtype = typeof(M);
PropertyInfo[] MProperties = Mtype.GetProperties(BindingFlags.Public | BindingFlags.Instance);
Type VMtype = typeof(VM);
PropertyInfo[] VMProperties = VMtype.GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var VMProperty in VMProperties)
{
if (!VMProperty.PropertyType.GetInterfaces().Any(x => x.Name == typeof(IModel).Name)
&& MProperties.Any(x => x.Name == VMProperty.Name)
&& Mtype.GetProperty(VMProperty.Name).PropertyType == VMProperty.PropertyType)
{
var OldValue = Mtype.GetProperty(VMProperty.Name).GetValue(Model);
var NewValue = VMtype.GetProperty(VMProperty.Name).GetValue(ViewModel);
if (NewValue != null)
{
if (OldValue == null)
{
Mtype.GetProperty(VMProperty.Name).SetValue(Model, NewValue);
HasUpdates = true;
}
else
{
if (OldValue != NewValue)
{
Mtype.GetProperty(VMProperty.Name).SetValue(Model, NewValue);
HasUpdates = true;
}
}
}
}
}
return HasUpdates;
}
Я бы предложил использовать 'object.Equals (OldValue, NewValue) ', который обрабатывает null-check для вас. –
Согласен, я скорректировал свой ответ таким образом – David