簡體   English   中英

Automapper enum to Enumeration Class

[英]Automapper enum to Enumeration Class

我正在嘗試使用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。

謝謝,亞歷克斯

以下是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>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM