簡體   English   中英

使用 automapper 將 long 映射到枚舉

[英]Map long to enum using automapper

我在使用 automapper 將 long 值轉換為 enum 時遇到問題。 如果我什么都不做,我就會得到例外

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

映射類型: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 中的枚舉的一般規則?

這似乎是不可能的。 但是您可以使用工廠簡化為枚舉添加轉換的過程:

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 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM