[英]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.