2013-02-18 2 views
7

Я использую AutoMapper для копирования свойств одного объекта к другому: Это мой код:Использование AutoMapper для отображения неизвестных типов

// Get type and create first object 
Type itemType = Type.GetType(itemTypeName); 
var item = Activator.CreateInstance(itemType); 

// Set item properties 
.. Code removed for clarity .. 

// Get item from Entity Framework DbContext 
var set = dataContext.Set(itemType); 
var itemInDatabase = set.Find(id); 
if (itemInDatabase == null) 
{ 
    itemInDatabase = Activator.CreateInstance(itemType); 
    set.Add(itemInDatabase); 
} 

// Copy item to itemInDatabase 
Mapper.CreateMap(itemType, itemType); 
Mapper.Map(item, itemInDatabase); 

// Save changes 
dataContext.SaveChanges(); 

Проблема заключается в том, что Mapper.Map() бросает AutoMapperMappingException:

Missing type map configuration or unsupported mapping. 

Mapping types: 
Object -> MachineDataModel 
System.Object -> MyProject.DataModels.MachineDataModel 

Destination path: 
MachineDataModel 

Source value: 
MyProject.DataModels.MachineDataModel 

Я действительно не понимаю, в чем проблема, и что я могу сделать, чтобы исправить это?

ответ

10

Вы должны использовать необщую перегрузку Map:

Mapper.Map(item, itemInDatabase, item.GetType(), itemInDatabase.GetType()); 

Причина заключается в том, что общая версию вы используете не использует тип во время выполнения экземпляров вы проходите. Скорее он использует тип времени компиляции - и тип времени компиляции item равен object, потому что это возвращаемое значение Activator.CreateInstance.

+0

Ха-ха, я собирался рассказать вам о переключении порядка параметров, но вы были слишком быстры. Но это работает как шарм! Я приму свой ответ, как только смогу. – Joel

+0

@Joel: Да, я сначала записал соответствующие части, а затем посмотрел правильный порядок :) –

Смежные вопросы