Automapper - 从小写到pascal案例的地图模型

时间:2015-07-21 12:00:42

标签: c# .net regex automapper lowercase

我有两个模特。

来源模型:

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; }
}

因此,我使用automapper和单元测试创​​建了一个映射。

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();
        }
    }

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

正如您所看到的那样,命名存在问题,因为源模型中的某些名称我有一些不同的命名约定,如小写或较低的驼峰情况。有没有人有想法解决这个问题?或者我是否必须手动绘制所有内容?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我想我找到了解决问题的正确方法。很抱歉不熟悉正则表达式。我刚刚结合了

的RegExes

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; }
    }
}