【问题标题】:Map long to enum using automapper使用自动映射器将 long 映射到枚举
【发布时间】:2020-01-27 09:23:35
【问题描述】:

我在使用自动映射器将长值转换为枚举时遇到问题。如果我什么都不做,我会得到异常

缺少类型映射配置或不支持的映射。

映射类型: 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);
    }
}

但是我必须为解决方案中的每个枚举定义它,有没有办法定义将 long 转换为 automapper 中的枚举的一般规则?

【问题讨论】:

  • 对所有涉及的枚举尝试enum : long

标签: c# enums automapper


【解决方案1】:

这似乎是不可能的。但是您可以使用工厂简化添加枚举的转换:

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 大小枚举,请使用 long 类型 (doc)。

【讨论】:

  • “看来这是不可能的。”看起来像正确答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
相关资源
最近更新 更多