2014-06-27 206 views
4

我想要使用Automapper从常规枚举映射到枚举类(如由Jimmy Bogard - http://lostechies.com/jimmybogard/2008/08/12/enumeration-classes/所述)。常规枚举与枚举类不具有相同的值。因此,我想使用的名称,如果可能的映射:自动映射器枚举枚举类

枚举:

public enum ProductType 
{ 
    ProductType1, 
    ProductType2 
} 

枚举类:

public class ProductType : Enumeration 
{ 
    public static ProductType ProductType1 = new ProductType(8, "Product Type 1"); 
    public static ProductType ProductType2 = new ProductType(72, "Product Type 2"); 

    public ProductType(int value, string displayName) 
     : base(value, displayName) 
    { 
    } 

    public ProductType() 
    { 
    } 
} 

任何帮助,使这个映射的工作表示赞赏!我曾尝试只是一个普通的映射:

Mapper.Map<ProductType, Domain.ProductType>(); 

..但映射的类型有0

感谢的价值, 亚历

+0

关于反对票的一些反馈将是伟大的无论你是谁,谢谢 –

回答

3

这里是Automapper如何工作 - 它得到公众实例属性/目标类型的字段,并且与公共实例匹配源类型的属性/字段。你的枚举没有公共属性。枚举类有两个 - Value和DisplayName。 Automapper没有什么可以映射的。你可以使用最好的事情是简单的映射功能(我喜欢使用这个扩展的方法):

public static Domain.ProductType ToDomainProductType(
    this ProductType productType) 
{ 
    switch (productType) 
    { 
     case ProductType.ProductType1: 
      return Domain.ProductType.ProductType1; 
     case ProductType.ProductType2: 
      return Domain.ProductType.ProductType2; 
     default: 
      throw new ArgumentException(); 
    } 
} 

用法:

ProductType productType = ProductType.ProductType1; 
var result = productType.ToDomainProductType(); 

如果你真的想在这种情况下使用Automapper,你CA提供这种创作方法ConstructUsing方法映射表达:

Mapper.CreateMap<ProductType, Domain.ProductType>() 
     .ConstructUsing(Extensions.ToDomainProductType); 

您还可以在此创建方法移到Domain.ProductType类。然后,从给定的枚举值创建其实例将是这样的:

var result = Domain.ProductType.Create(productType); 

更新:您可以使用反射来创建其枚举和相应的枚举类之间的映射泛型方法:

public static TEnumeration ToEnumeration<TEnum, TEnumeration>(this TEnum value) 
{ 
    string name = Enum.GetName(typeof(TEnum), value); 
    var field = typeof(TEnumeration).GetField(name); 
    return (TEnumeration)field.GetValue(null); 
} 

用法:

var result = productType.ToEnumeration<ProductType, Domain.ProductType>(); 
+1

谢谢你为了一个很好的解释,我现在明白了这个问题。我想我最终可能会将枚举更改为具有匹配的值,并映射到枚举类的Value实例成员。我比其他任何事都更好奇!我认为反射版本相当不错,所以在某些时候可能会派上用场。谢谢 –

+0

这就是我最终做的 - 如果你确实想从枚举映射的枚举类(我知道一个不同的问题) mapper.CreateMap () .ConstructUsing (dto => Enumeration.FromValue ((int)dto.SourceValue)); –