Automapper将枚举映射到枚举类

5
我是一个有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我正在尝试使用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。

谢谢, Alex


不管你是谁,如果你能提供一些关于负面投票的反馈,那将是非常好的,谢谢。 - Al Hunter
1个回答

5
这里是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>();

1
谢谢你的清晰解释,我现在明白问题了。我想我最终会将枚举更改为具有匹配值,并映射到枚举类的Value实例成员。我只是比较好奇而已!我认为反射版本相当不错,所以在某些时候可能会派上用场。谢谢。 - Al Hunter
这是我最终所做的 - 如果你确实想要从具有与枚举类相同值的枚举进行映射(我知道这是另一个问题)mapper.CreateMap<ProductType, Domain.ProductType>() .ConstructUsing(dto => Enumeration.FromValue<Domain.ProductType>((int)dto.SourceValue)); - Al Hunter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接