自动枚举枚举类
本文关键字:枚举 | 更新日期: 2023-09-27 18:10:37
我正在尝试使用Automapper从常规枚举映射到枚举类(如Jimmy Bogard - http://lostechies.com/jimmybogard/2008/08/12/enumeration-classes/所述)。常规枚举不具有与枚举类相同的值。因此,如果可能的话,我希望使用Name进行映射:
Enum: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来说没有什么需要映射的。您可以使用的最好的方法是简单的mapper函数(我喜欢使用扩展方法):
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);
UPDATE:您可以使用反射来创建泛型方法,该方法在枚举和适当的枚举类之间映射:
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>();