我在使用自动映射器将long值转换为枚举时遇到问题。如果我什么都不做,我会得到例外
缺少类型映射配置或不支持的映射。
映射类型: Int64-> SomeEnum
因此,如果我添加映射配置,它将起作用
public enum B
{
F1,
F2
}
public class A
{
public B FieldB { get; set; }
}
class Program
{
static void Main(string[] args)
{
var autoMapper = new Mapper(new MapperConfiguration(expression =>
{
expression.CreateMap<long, B>()
.ConvertUsing(l => (B)l);
}));
var dictionary = new Dictionary<string, object>()
{
{"FieldB", 1L}
};
var result = autoMapper.Map<A>(dictionary);
}
}
但是我必须为解决方案中的每个枚举定义它,有没有一种方法可以定义在automapper中将long转换为enum的一般规则?
答案 0 :(得分:0)
看来这是不可能的。但是您可以使用工厂简化为枚举添加的转换:
public class CommonMappingProfile : Profile
{
public CommonMappingProfile()
{
CreateMapLongToEnum<B>();
}
private void CreateMapLongToEnum<T>() where T : Enum
{
CreateMap<long, T>().ConvertUsing(l => (T)Enum.ToObject(typeof(T) , l));
}
}
public class MapperConfigFactory
{
public MapperConfiguration Create(Action<IMapperConfigurationExpression> configExpression = null)
{
var config = new MapperConfiguration(cfg =>
{
cfg.AddProfile<CommonMappingProfile>();
configExpression?.Invoke(cfg);
});
return config;
}
}
然后输入您的代码:
var autoMapperConfigFactory = new MapperConfigFactory();
var autoMapper = new Mapper(autoMapperConfigFactory.Create(cfg =>
{
/* Custom settings if required */
}));
var result = autoMapper.Map<A>(dictionary);
PS:在示例中,您有int size枚举,请使用long类型(doc)。