部分属性名称匹配意外地自动映射属性

Tja*_*alt 6 c# automapper

我有两个类被映射.源类有一个DateTime属性,它被映射到type long(DateTime.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>();                   
    }
} 
Run Code Online (Sandbox Code Playgroud)

控制台中的结果:

在此输入图像描述

一块手表:

在此输入图像描述

Mar*_*oDS 4

您正在触发 AutoMapper 的展平功能。来自文档

当您在 AutoMapper 中配置源/目标类型对时,配置器会尝试将源类型上的属性和方法与目标类型上的属性进行匹配。如果对于目标类型上的任何属性,源类型上不存在以“Get”为前缀的属性、方法或方法,则 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);
Run Code Online (Sandbox Code Playgroud)

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

MyDateTicks这与匹配完全相同,后者根据需要MyDate.Ticks返回 a ...long