2017-10-12 101 views
0

我試圖讓ValueInjector在過去使用Automapper。我想將一個枚舉轉換爲只有枚舉名稱不同但屬性名稱和值相同的枚舉。如何使用值注射器映射枚舉

public enum GenderModel 
    { 
     NotSpecified = 0, 
     Male = 1, 
     Female = 2 
    } 

public enum GenderDto 
    { 
     NotSpecified = 0, 
     Male = 1, 
     Female = 2 
    } 

然後我試圖映射這樣

var model = GenderModel.Male; 
      var dto = GenderDto.NotSpecified; 
      dto.InjectFrom(model); 

我期待在DTO對象來獲得男性,但它仍設置爲NotSpecified。

我缺少什麼?請指導。

回答

2

在我看來,ValueInjecter無法映射值類型,如enum, struct, int, double。或者不需要映射值類型。它只會幫助映射具有相同名稱和類型的類類型的屬性。爲了在這個例子中映射枚舉,我建議,

var model = GenderModel.Male; 
    var dto = GenderDto.NotSpecified; 
    dto = (GenderDto)model; 

如果枚舉嵌套在特定的類,默認ValueInjecter不能映射GenderModelGenderDto因爲它們是不同類型的。所以我們可以通過客戶ValueInjecter來實現它。這是我的測試代碼,希望它可以幫助。

public enum GenderModel 
{ 
    NotSpecified = 0, 
    Male = 1, 
    Female = 2 
} 

public enum GenderDto 
{ 
    NotSpecified = 0, 
    Male = 1, 
    Female = 2 
} 

public class Person1 
{ 
    public GenderModel Gender { get; set; } 
} 

public class Person2 
{ 
    public GenderDto Gender { get; set; } 
} 

public class EnumMapInjection:IValueInjection 
{ 
    public object Map(object source, object target) 
    { 
     StaticValueInjecter.DefaultInjection.Map(source, target); 
     if (target is Person2 && source is Person1) 
     { 
      ((Person2) target).Gender = (GenderDto)((Person1) source).Gender; 
     } 
     return target; 
    } 
} 

和主要功能代碼:

static void Main(string[] args) 
    { 
     var person1 = new Person1(){Gender = GenderModel.Male}; 
     var person2 = new Person2(){Gender = GenderDto.Female}; 
     person2.InjectFrom<EnumMapInjection>(person1); 
    } 
+0

是的,但想象一下,如果這個枚舉嵌套在一個Person類和我得到的名單人,並想將它們映射到DTO列表。除非我可以使用ValueInjecter定義映射,否則我需要迭代列表並手動映射枚舉。 –

+0

在這種情況下,我建議客戶注射從IValueInjection繼承。我可以在我的答案中給你一個例子。 – Renshaw

+0

完美的完成,謝謝! –

0

型鑄造是您的解決方案

dto = (GenderDto)model;