2014-06-27 256 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)); –