我设置了一个简单的控制台应用程序,然后尝试进行转换:

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}


至:

public class user_dto
{
    public string ud_first_name { get; set; }
    public string ud_lastname { get; set; }
}


然后将它们转换回去。这是我的尝试:

public static class AutoMapperConfig
{
    public static void RegisterMappings()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.RecognizeDestinationPrefixes(new []{"ud_"});
            cfg.RecognizePrefixes(new[] { "ud_" });
            cfg.DestinationMemberNamingConvention = new LowerUnderscoreNamingConvention();
            cfg.SourceMemberNamingConvention = new PascalCaseNamingConvention();

            cfg.CreateMap<User, user_dto>().ReverseMap();
        });
    }
}

static void Main(string[] args)
{
    AutoMapperConfig.RegisterMappings();

    var newUser = new User
    {
        FirstName = "John",
        LastName = "Doe"
    };

    var newUser2 = new user_dto
    {
        ud_first_name = "Marry",
        ud_lastname = "Jane"
    };

    var newUserDTO = AutoMapper.Mapper.Map<user_dto>(newUser);

    Console.Write(newUserDTO.ud_first_name + " " + newUserDTO.ud_lastname);

    var newUserViewModel = AutoMapper.Mapper.Map<User>(newUser2);

    Console.Write(newUserViewModel.FirstName + " " + newUserViewModel.LastName);
    Thread.Sleep(100);
}


这对于转换姓氏(而不是姓氏)非常有效。按照我设置的the docs命名约定,它应该转换first_name-> FirstName,但是它默默地失败并且仅转换lastname

有趣的是,如果我删除配置中的前缀行并从ud_中删除​​开头的user_dto并运行应用程序,则将转换John Doe的全名,但仅转换Marry的姓氏。您是否无法删除前缀并使用命名约定与automapper进行转换?是否应该有其他/更好的方法来实现我正在尝试的目标?

最佳答案

我不知道您是否能够更改dto中的属性名称,但是如果您可以一致地使用下划线,则在4.2.1版或AutoMapper中它似乎可以正常工作。

public class user_dto
{
    public string ud_firstname { get; set; }
    public string ud_lastname { get; set; }
}


输出:

John DoeMary Jane


我猜想AutoMapper会与下划线的数量混淆,这就是为什么当您删除ud_部分时它会部分起作用的原因

更新:

感觉错了,但确实可行,因此在这种情况下也许是一种解决方法。将以下行添加到配置中,以在完成自动映射后允许自定义映射。

cfg.CreateMap<User, user_dto>().ReverseMap().AfterMap((src, dest) => dest.FirstName = src.ud_first_name);
cfg.CreateMap<user_dto, User>().ReverseMap().AfterMap((src, dest) => dest.ud_first_name = src.FirstName);


完整的配置类:

public static class AutoMapperConfig
{
    public static void RegisterMappings()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.RecognizeDestinationPrefixes(new []{"ud_"});
            cfg.RecognizePrefixes(new[] { "ud_" });
            cfg.DestinationMemberNamingConvention = new LowerUnderscoreNamingConvention();
            cfg.SourceMemberNamingConvention = new PascalCaseNamingConvention();
            cfg.CreateMap<User, user_dto>().ReverseMap().AfterMap((src, dest) => dest.FirstName = src.ud_first_name);
            cfg.CreateMap<user_dto, User>().ReverseMap().AfterMap((src, dest) => dest.ud_first_name = src.FirstName);
        });
    }
}

关于c# - 在自动映射器中使用命名约定和前缀的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43497334/

10-11 10:44