2015-04-23 1 views
0

Я хотел бы объединить один объект в другой общим способом, который может использоваться повторно для других более сложных объектов. Я только хочу, чтобы NULL менялись.Как скопировать все поля из одного объекта в другой, но только когда значение назначения равно NULL

ie. объединить sourcePerson и detinationPerson получить resultingPerson (ниже)

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int? Age { get; set; } 
    public string Address { get; set; } 
} 

var sourcePerson = new Person 
{ 
    FirstName = "Bill", 
    LastName = "Smith", 
    Age = 43, 
    Address = "123 Some Street" 
}; 
var destinationPerson = new Person 
{ 
    FirstName = "Barbara", 
    LastName = null, 
    Age = 41, 
    Address = null 
}; 
var resultingPerson = new Person 
{ 
    FirstName = "Barbara", 
    LastName = "Smith", 
    Age = 41, 
    Address = "123 Some Street" 
}; 

Я попытался Automapper, но не могу настроить его должным образом. Я чувствую, что следующее должно работать. Помогите?

Mapper.CreateMap<Person, Person>().ForAllMembers(opt => opt.UseDestinationValue()); 
Mapper.Map(sourcePerson, destinationPerson); 
+0

ли он работать тогда? С какими проблемами вы сталкиваетесь? –

+0

Пожалуйста, смотрите здесь, похоже, у вас такая же проблема. Http://stackoverflow.com/questions/24359634/c-sharp-automapper-conditional-mapping-based-upon-target-value – tutok

+0

@Matt Меняет ваше сопоставление на: 'Mapper.CreateMap (). ForAllMembers (opt => opt.Condition (person => person.DestinationValue == null));' работает? – IronGeek

ответ

0

Вы можете использовать отражение, как это:

public static T Merge<T>(T source, T destination) 
    { 
     var returnvalue = (T) Activator.CreateInstance(typeof (T)); 
     foreach (var field in destination.GetType().GetProperties()) 
     { 
      field.SetValue(returnvalue, 
       field.GetValue(destination, null) == null ? field.GetValue(source) : field.GetValue(destination)); 
     } 
     return returnvalue; 
    } 

Я не проверял это для других, чем просто DTOS.

+0

Спасибо. Я очень хочу попробовать Automapper. Если я не могу заставить его работать на меня, я пойду с вашим подходом –

1

Спасибо IronGeek и tutok.

Да, следующие работы:

Mapper.CreateMap<Person, Person>() 
     .ForAllMembers(opt => opt.Condition(person => person.DestinationValue == null)); 
Смежные вопросы