Automapper:ForMember 中复杂的 if else 语句

问题描述 投票:0回答:3

假设

Date
是可空的
DateTime
:

Mapper.CreateMap<SomeViewModels, SomeDTO>()               
             .ForMember(dest => dest.Date,
                        opt => opt.MapFrom(src =>
                        {
                            DateTime? finalDate = null;
                            if (src.HasDate == "N")
                            {
                                // so it should be null
                            }
                            else
                            {                                   
                                endResult = DateTime.Parse(src.Date.ToString());
                                
                            }                               
                            return finalDate;

                        }));

我得到的错误是:

错误 30 无法转换带有语句主体的 lambda 表达式 到表达式树。

当然我完全知道我可以简化查询,例如:

Mapper.CreateMap<SomeViewModels, SomeDTO>()
             .ForMember(dest => dest.Date,
                        opt => opt.MapFrom(src => src.HasDate == "N" ? null : DateTime.Parse(src.Date.ToString())));
    

但是,如果我坚持保留第一个示例的结构,因为我有更复杂的 if else 语句,那么第二个示例将无法满足,或者至少不会非常可读?

c# if-statement automapper
3个回答
80
投票

在 AutoMapper 的最新版本中,

ResolveUsing
已被删除。相反,使用 MapFrom 的新重载:

void MapFrom<TResult>(Func<TSource, TDestination, TResult> mappingFunction);

只需添加另一个 lambda/函数参数就会分派到这个新的重载:

        CreateMap<TSource, TDest>()
                .ForMember(dest => dest.SomeDestProp, opt => opt.MapFrom((src, dest) =>
                {
                    TSomeDestProp destinationValue;

                    // mapping logic goes here

                    return destinationValue;
                }));

30
投票

使用

ResolveUsing()
方法:

Mapper.CreateMap<SomeViewModels, SomeDTO>()               
         .ForMember(dest => dest.Date, o => o.ResolveUsing(Converter));

private static object Converter(SomeViewModels value)
{
    DateTime? finalDate = null;
    if (value.Date.HasDate == "N")
    {
        // so it should be null
    }
    else
    {                                   
        finalDate = DateTime.Parse(value.Date.ToString());
    }                               
    return finalDate;
}

0
投票

尝试这样

Mapper.CreateMap<SomeViewModels, SomeDTO>()               
         .ForMember(dest => dest.Date,
                    opt => opt.MapFrom(src => src.HasDate == "N" ? "" : DateTime.Parse(src.Date.ToString())));
© www.soinside.com 2019 - 2024. All rights reserved.