【问题标题】:AutoMapper issueAutoMapper 问题
【发布时间】:2009-04-09 01:04:50
【问题描述】:

尝试自动映射一些对象。
源对象具有名称前带有 _ 的属性,目标对象没有。 是否可以实现一个地图创建,自动映射器会将所有 _properties 映射到属性
适用于所有来源类型。

class MyMapper<TFrom, TTo>{
    TTo PerformMap(TFrom fromObject){
        Mapper.CreateMap<From, To>(); // ???
        TTo result = Mapper.Map<From, To>(fromObject);
        //result.Id.ShouldBe(value from TFrom._Id);
        return result;
    }
}

class From
{
    public int _Id { get; set; }
    public string _Name { get; set; }
}

class To
{
    public int Id { get; set; }
    public string Name { get; set; }
}

【问题讨论】:

    标签: asp.net dto-mapping


    【解决方案1】:

    我最近添加到 AutoMapper 的内容可能会对您有所帮助 - 自定义命名约定。如果您检查后备箱 (R107),请四处寻找 INamingConvention。现在,我有两种命名约定(PascalCase 和 lower_case_underscore),但实际上只需找出正确的 RegEx 即可:

    INamingConvention.cs

    目前,命名约定是全局和配置文件范围的。由于此功能是新功能,因此除了测试之外没有任何文档。

    【讨论】:

    • 我目前没有使用 AM,但很高兴了解此功能。 :)
    • 这个答案中的链接给出了 404,你能更新一下吗?感谢 Jimmy 的出色工作!
    • 这是否适用于 IDataReader 源?我正在尝试将 lower_case_underscore 中的 DataTable 映射到带有 PascalCase 属性的对象,但似乎无法让它工作。
    【解决方案2】:

    我就是这样做的

    Mapper.Initialize(cfg =>
            {
                cfg.RecognizeDestinationPrefixes(new []{"_"});
                cfg.RecognizePrefixes(new[] { "_" });
    
                cfg.CreateMap<To, From>().ReverseMap();
            });
    

    【讨论】:

      【解决方案3】:

      为此,您可以添加自定义映射来解决这种特殊情况:

      Mapper.CreateMap<From, To>()
         .ForMember( dest => dest.Id, opt => opt.MapFrom( src => src._Id ) )
         .ForMember( dest => dest.Name, opt => opt.MapFrom( src => src._Name ) );
      

      【讨论】:

      • Thats the effect i need, but... I wanted that to be more generic. Like saying - automapper, map those 2 objects, and ignore underscore of prop name, if its 名称中的第一个符号。否则 - 我必须注意所有对象对。
      • 这在可能有数百个 POCO 的实际应用程序中是不现实的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 2016-04-02
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多