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.cs
和
AutoMapper/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; }
}
}
我有两个模型。
源模型:
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.cs 和 AutoMapper/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; }
}
}