gpt4 book ai didi

c# - 在自动映射器中使用命名约定和前缀的问题

转载 作者:行者123 更新时间:2023-11-30 20:31:14 25 4
gpt4 key购买 nike

我设置了一个简单的控制台应用程序,我正在尝试转换:

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 被转换。

有趣的是,如果我删除配置中的前缀行并从 user_dto 中删除前导 ud_ 并运行应用程序,John Doe 的全名将被转换,但只有 Marry 的姓氏会被转换。您是否无法删除 prefixis 并使用命名约定与 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com