通过命名约定来映射属性

时间:2018-02-13 14:49:50

标签: automapper automapper-6

我正在使用automapper在数据库和另一个表示之间映射一些对象。

该实体看起来像

public class MyEntity {
    public int Id { get; set; }
    public Guid RowId { get; set; }
}  

public class MyObject {
    public Guid Id { get; set; }
}

如您所见,名称和类型未对齐 由于我有很多实体和对象,我宁愿不CreateMap<A, B>().ForMember(d => d.Id, mex => mex.MapFrom(s => s.RowId));

不必执行上述公约:

AddMemberConfiguration()
    .AddMember<NameSplitMember>()
    .AddName<ReplaceName>(_ => _.AddReplace("RowId", "Id"));

这不是我怀疑它做的,我无法弄清楚,如何使用ReplaceName约定。 因此,我想听听有关如何映射这些类型的想法。

MyEntityMyObject都是基类型,所以我也可以使用它。

我试图在伪代码中实现目标:

if(source is MyEntity && target is MyObject)
{
     target.Id = source.RowId;
}

ForAllMembers
根据@ lucian-bargaoanu的推荐,我试着调查ForAllMembers 我在MapperProfile中执行了以下操作:

public class MapperProfile : Profile {
     public MapperProfile() {
         ForAllMaps(MapEntityBaseId);
     }

    protected void MapEntityBaseId(TypeMap map, IMappingExpression mex)
    {
        if (!map.SourceType.IsSubclassOf(typeof(EntityBase)))
            return;
        if (!map.DestinationType.IsSubclassOf(typeof(MyObject)))
            return;

        mex.ForMember("Id", opt => opt.MapFrom("RowId"));
    }
}

调试器也提示我,ForAllMember按预期执行,但仍然无法映射。

我为ForAllMembers创建了一个GIST:https://gist.github.com/anonymous/511a1b69b795aa2bc7e7cd261fcb98b1

0 个答案:

没有答案