我设置了一个简单的控制台应用程序,然后尝试进行转换:
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/