【发布时间】:2014-04-10 17:31:34
【问题描述】:
在我的视图域模型中,我有以下对象用作我的属性的支持字段
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));
但我得到了异常表达式必须解析为顶级成员而不是任何子对象的属性。在子类型或 AfterMap 选项上使用自定义解析器。
我是 automapper 的新手,但是在查看文档时,我正在使用的对象太复杂(基于这里确实有三种类型而不是两种类型的想法)?
如果可以处理这种类型的映射,这是如何完成的?
更新
根据 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,它仍然为空。
我错过了什么?
-干杯
【问题讨论】:
-
我终于发现了未分配值的问题所在。我在域模型中创建的属性只定义了 get 和 return,但没有 setter。我向属性添加了一个私有设置器,现在正在应用映射
标签: c# automapper