如何使用复杂类型的automapper

时间:2014-04-10 17:31:35

标签: c# automapper

在我的视图的域模型中,我有以下对象作为我的属性的支持字段

public class ModelProperty<T>// where t:struct
{
    public T Value { get; set; }
    public string Description { get;  set; }
    public string LabelName { get;  set; }
}

该对象依次表示为:

    public partial class Incident : BaseEntityModel
    {
        private ModelProperty<string> typeCode = new ModelProperty<string>{Description="1-C", LabelName =  "Type Code"};
        private ModelProperty<string> typeText = new ModelProperty<string>{Description="1-C", LabelName =  "Type Text"};

        public ModelProperty<string> TypeCode { get {return typeCode;}}
        public ModelProperty<string> TypeText { get {return typeText;}}
    }

业务对象(我的来源)并不复杂。

public partial class Incident : ObjectBase
{
    public string TypeCode { get; set; }
    public string TypeText { get; set; }
}

是否可以将值从源映射到目标。使用Automapper我有以下映射设置

//note SrcObj is not an object but a namespace alias since the domain and business objects are of the same name
Mapper.CreateMap<SrcObj.Incident, Incident>()
                .ForMember(ui => ui.TypeText.Value,
                           opt => opt.MapFrom(src => src.TypeText));

但我得到异常Expression必须解析为顶级成员而不是任何子对象的属性。请改用子类型或AfterMap选项上的自定义解析器。

我是自动播放器的新手,但在查看文档时,我正在处理的对象过于复杂(基于这里有三种类型而不是两种类型的想法)?

如果可以处理这种类型的映射,这是怎么做到的?

更新

根据Jimmy的建议,我更新了我的代码如下:

Mapper.CreateMap<SrcObj.Incident, Incident>();
Mapper.CreateMap<string, ModelProperty<string>>()
                .ConvertUsing(src => new ModelProperty<string> { Value = src });

Mapper.AssertConfigurationIsValid();     
SrcObj.Incident viewModelDto = md.GenerateMockIncident(); //populate the business object with mock data    
uibase = Mapper.Map<SrcObj.Incident, Incident>(viewModelDto);

代码执行但我没有得到任何异常,但是在业务对象中设置和返回的值仍未分配给支持属性Value它仍为空。

我错过了什么?

-cheers

2 个答案:

答案 0 :(得分:2)

试试这个..您需要将ModelProperty对象映射到目标TypeText

Mapper.CreateMap<Funky.Incident, Incident>()
       .ForMember(ui => ui.TypeText,
                  opt => opt.MapFrom(src => 
                         new ModelProperty<string> 
                         { 
                          Value = src.TypeText 
                         }));

对TypeCode属性映射执行相同操作,以便映射所有字段。

您需要考虑每个成员映射,只要它们的名称不同或者它们的类型名称不同。在这种情况下,AutoMapper将很难将字符串转换为Model对象,直到您提供提示。

尝试映射TypeCode ..我也不知道ObjectBase等的属性。所以你需要检查是否还需要手动映射。

答案 1 :(得分:2)

更简单的方法是创建一个类型转换器:

Mapper.CreateMap<string, ModelProperty<string>>()
    .ConvertUsing(src => new ModelProperty<string> { Value = src });

然后,每次AutoMapper看到字符串时,您都会看到此字符串 - &gt; ModelProperty。您根本不必进行特定于成员的配置。