2015-07-21 53 views
0

我有兩種模型。Automapper - 將模型從小寫映射到pascal案例

來源模型:

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

當我運行測試時,目標模型中的每個字段都爲空。

正如你可以看到有一個命名的問題,因爲在源模型中的一些名稱我有一些不同的命名約定,如小寫或較低的駱駝大小寫。有沒有人有解決這個問題的想法?或者我必須映射一切manualy?

+0

在'map'方法中,您映射到Address類而不是示例中給出的Adresse類。這只是一個錯字嗎? –

+0

是的你是對的。我的錯。但是,landCode的映射仍然不起作用。與我的RegEx的東西是不正確的 – Kris

回答

0

我想我找到了適合我的問題的解決方案。對不起,不喜歡正則表達式。我只是結合了正則表達式從

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

您應該像下面那樣使用DataContract和DataMember屬性,以便您不需要賦予屬性相同的名稱,也可以遵循編碼標準。

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