部分属性名称匹配

时间:2015-09-07 11:19:18

标签: c# automapper

我有两个类被映射。源类具有DateTime属性,该属性将映射到类型为longDateTime.Ticks)的目标属性,分别为UpdateDtUpdateDtTicks

当我使用Automapper映射这两个类时,UpdateDtTicks属性会自动从UpdateDt属性中获取值,即使属性名称不相同而且我没有显式设置映射这个属性。

Automapper是否自动设置属性,因为属性名称最后只有不同?如果不是,为什么会发生这种情况,因为这是意外的行为。

请参阅以下代码:

static void Main(string[] args)
{
    Configuration.Configure();

    var person = new OrderDto 
    {
        OrderId  = 999,
        MyDate   = new DateTime(2015, 1, 1, 4, 5, 6)
    };

    var orderModel = Mapper.Map<OrderModel>(person); 

    Console.WriteLine(new DateTime(orderModel.MyDateTicks.Value));
    Console.ReadLine();           
}

public class OrderDto 
{
    public int      OrderId  { get; set; }
    public DateTime MyDate   { get; set; }
}

public class OrderModel 
{
    public int      OrderId     { get; set; }
    public long?    MyDateTicks { get; set; }
}

public class Configuration
{
    public static void Configure() 
    {
        Mapper.CreateMap<OrderDto, OrderModel>();                   
    }
} 

控制台中的结果:

enter image description here

还有一只手表:

enter image description here

1 个答案:

答案 0 :(得分:4)

您正在触发AutoMapper的展平功能。弗罗姆documentation

  

在AutoMapper中配置源/目标类型对时,配置程序会尝试将源类型上的属性和方法与目标类型上的属性进行匹配。如果目标上的任何属性键入属性,方法或前缀为&#34; Get&#34;在源类型上不存在,AutoMapper 将目标成员名称拆分为单个单词(通过PascalCase约定)

因此,给出以下示例(来自他们的文档,在我的回答中缩短):

public class Order
{
    public Customer Customer { get; set; }
}

public class Customer
{
    public string Name { get; set; }
}

public class OrderDto
{
    public string CustomerName { get; set; }
    public decimal Total { get; set; }
}

Mapper.CreateMap<Order, OrderDto>();

var order = new Order
{
    Customer = new Customer
    {
        Name = "John Doe"
    }
};

OrderDto dto = Mapper.Map<Order, OrderDto>(order);
  

CustomerName属性与Order上的Customer.Name属性匹配。

这与匹配MyDateTicks的{​​{1}}完全相同,MyDate.Ticks根据需要返回long ...