2014-09-03 3 views
1

У меня есть два одинаковых классов в разных пространствах имен:Карта с поля только для чтения Automapper

namespace ClassLibrary1 
class Class1 
{ 
    public readonly int field1; 
    public Class1(int value) { field1 = value; } 
} 

И такое же определение класса в пространстве имен ClassLibrary2.

Когда я пытаюсь использовать AutoMapper, я получаю это исключение:

Выражение должно быть записываемые Имя параметра: слева

Это код AutoMapper:

Mapper.CreateMap<ClassLibrary1.Class1, ClassLibrary2.Class1>(); 
var result = Mapper.Map<ClassLibrary2.Class1>(class1); 

Но если я попробую это AutoMapper Exclude Fields, это не сработает, используя это:

Mapper.CreateMap<ClassLibrary1.Class1, ClassLibrary2.Class1>() 
    .ForMember(a => a.field1, a => a.Ignore()); 

Наверняка это работает, чтобы изменить его на свойство с открытым доступом и частным набором (например, в Automapper ignore readonly properties), но я хочу, чтобы будущий разработчик не устанавливал значение после конструктора.

Есть ли способ решить это с помощью AutoMapper?

+0

Вы можете использовать пользовательские отображения: http://stackoverflow.com/questions/8046442/ отображение-чтения-ребенок-коллекция-с-automapper – mostruash

ответ

3

Если вы хотите установить свойство в конструкторе, используйте .ConstructUsing, а затем игнорировать поле:

Mapper.CreateMap<ClassLibrary1.Class1, ClassLibrary2.Class1>() 
    .ConstructUsing(cls1 => new ClassLibrary2.Class1(cls1.field1)) 
    .ForMember(a => a.field1, a => a.Ignore()); 
Смежные вопросы