2017-10-12 81 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;