Automapper enum to Enumeration Class

时间:2014-06-27 13:46:01

标签: c# enums automapper

我尝试使用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.

谢谢, 亚历

1 个答案:

答案 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,你可以为映射表达式的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>();