【问题标题】:How to specify mapping rule when names of properties differ属性名称不同时如何指定映射规则
【发布时间】:2013-01-24 12:22:53
【问题描述】:

我是 Automapper 框架的新手。我有一个域类和一个 DTO 类,如下所示:

public class Employee
{
   public long Id {get;set;}
   public string Name {get;set;}
   public string Phone {get;set;}
   public string Fax {get;set;}
   public DateTime DateOfBirth {get;set;}
}

public class EmployeeDto
{
   public long Id {get;set;}
   public string FullName {get;set;}
   public DateTime DateOfBirth {get;set;}
}

注意:Employee 类的属性“Name”的名称与EmployeeDto 类的属性“FullName”的名称不同。 p>

这是将Employee对象映射到EmployeeDto的代码:

Mapper.CreateMap<Employee, EmployeeDto>(); // code line (***)
EmployeeDto dto = Mapper.Map<Employee, EmployeeDto>(employee); 

我的问题是:如果我想将Employee(源类)映射到EmployeeDto(目标类),如何指定映射规则?换句话说,我应该如何对上面的代码行(***)做更多的事情?

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

    考虑到我们有两个类

    public class LookupDetailsBO
        {
            public int ID { get; set; }
    
            public string Description { get; set; }
    
        }
    

    另一个类是

    public class MaterialBO
        {
            [MapTo(nameof(LookupDetailsBO.ID))]
            public int MaterialId { get; set; }
    
            [MapTo(nameof(LookupDetailsBO.Description))]
            public string MaterialName { get; set; }
    
            public int LanguageId { get; set; }
        }
    

    通过这种方式,您通常可以知道您遵循哪个属性。 并且您确保命名约定,因此如果您更改了源中的属性名称。 MapTo() 会提示错误

    【讨论】:

      【解决方案2】:

      只是为了使用 Automapper 8.1+ 将上面的 cmets 滚动到更新的方法中......

      var mapConfig = new MapperConfiguration(
         cfg => cfg.CreateMap<Employee, EmployeeDto>()
            .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name))
      );
      

      然后您将使用 mapConfig 构建映射器:

      var mapper = mapConfig.CreateMapper();
      

      【讨论】:

        【解决方案3】:

        我们也可以在类属性上指定映射

        来自https://docs.automapper.org/en/stable/Conventions.html#attribute-support

        属性支持

        AddMemberConfiguration().AddName&lt;SourceToDestinationNameMapperAttributesMember&gt;(); * 目前一直处于开启状态

        查找 SourceToDestinationMapperAttribute 的实例 属性/字段并调用用户定义的 isMatch 函数来查找 成员匹配。

        MapToAttribute 是其中之一,它将基于以下属性匹配属性 提供名称。

        public class Foo
        {
            [MapTo("SourceOfBar")]
            public int Bar { get; set; }
        }
        

        【讨论】:

        【解决方案4】:

        没关系,我自己找到了解决方案:

        Mapper.CreateMap<Employee, EmployeeDto>()
            .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));
        

        【讨论】:

        • 有没有办法为任何类全局指定它,比如前缀/后缀?例如,我有一堆来自库的类,每个类都有“本地化”属性。我想将它们映射到相应属性称为“LocalizedName”的类。我唯一的选择是将 ForMember 添加到每个映射配置吗?
        • Mapper 类中没有 CreateMap 方法 :(
        • @Navid_pdp11 是的。您需要静态类 Mapper 而不是实例
        • @JordyvanEijk 您使用的是哪个版本,具有静态“CreateMap”方法?在 5.1.1.0 中没有这样的东西
        • @MattThomas 在查看 automapper 的 github 后,我发现从 5.0 版开始,CreateMap 已过时,他们说您需要使用 MapperConfiguration 或 Mapper.Initialize。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        • 2021-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多