Automapper - 将模型从小写映射到 Pascal 大小写

Automapper - Map model from lowercase to pascal case

我有两个模型。

源模型:

public sealed class adresse
{
        public string strasse { get; set; }
        public string hausnummer { get; set; }
        public string plz { get; set; }
        public string ort { get; set; }
        public string landCode { get; set; }
}

目标模型:

public sealed class Adresse
{
        public string Strasse { get; set; }
        public string Hausnummer { get; set; }
        public string Plz { get; set; }
        public string Ort { get; set; }
        public string LandCode { get; set; }
}

因此我使用自动映射器和单元测试创​​建了一个映射。

public class AddressMapper
    {
        public Address map()
        {
            adresse add = new adresse();
            add.hausnummer = "1";
            add.ort = "Test";

            AutoMapper.Mapper.Initialize(cfg => {
                cfg.AddProfile<Profile1>();
            });
            return AutoMapper.Mapper.Map<Address>(add);
        }
    }

public class LowerNamingConvention : INamingConvention
    {
        public Regex SplittingExpression
        {
            get { return new Regex(@"[\p{Ll}a-z A-Z 0-9]+(?=_?)"); }
        }

        public string SeparatorCharacter
        {
            get { return string.Empty; }
        }
    }

public class Profile1 : Profile
    {
        protected override void Configure()
        {
            SourceMemberNamingConvention = new LowerNamingConvention();
            DestinationMemberNamingConvention = new PascalCaseNamingConvention();
            CreateMap<adresse, Address>();
        }
    }



[TestFixture]
    public class AddressMapperTest
    {
        [Test]
        public void TestMapper()
        {
            var sut = new AddressMapper();

            var value = sut.map();
        }
    }

当我 运行 测试目标模型中的每个字段都是空的。

如您所见,命名存在问题,因为源模型中的某些名称有时使用不同的命名约定,例如小写或小驼峰命名。有没有人有解决这个问题的想法?还是我必须手动映射所有内容?

您应该使用如下的 DataContract 和 DataMember 属性,这样您就不需要给 属性 一个相同的名称,也可以遵循编码标准。

    [DataContract(Namespace = "")]
    public class YourClass
    {
        [DataMember(EmitDefaultValue = false, Name = "myVariable")]
        public string MyVariable { get; set; }
    }

我想我找到了适合我的问题的解决方案。抱歉不熟悉正则表达式。我刚刚组合了

中的正则表达式

AutoMapper/src/AutoMapper/PascalCaseNamingConvention.csAutoMapper/src/AutoMapper/LowerUnderscoreNamingConvention.cs

进入我自己的命名约定。可能是有些情况会导致问题。但据我测试它有效。

public class LowerNamingConvention : INamingConvention
{
    public Regex SplittingExpression
    {
        get { return new Regex(@"[\p{Ll}0-9]+(?=$|\p{Lu}[\p{Ll}0-9])|\p{Lu}?[\p{Ll}0-9]+)"); }
    }

    public string SeparatorCharacter
    {
        get { return string.Empty; }
    }
}