C# 自动映射:FormMember中的复杂if-else语句

C# 自动映射:FormMember中的复杂if-else语句,c#,if-statement,automapper,C#,If Statement,Automapper,假设日期是可为空的日期时间: Mapper.CreateMap<SomeViewModels, SomeDTO>() .ForMember(dest => dest.Date, opt => opt.MapFrom(src => { DateTime? fina

假设
日期
是可为空的
日期时间

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;

                        }));
Mapper.CreateMap()
.FormMember(目标=>目标日期,
opt=>opt.MapFrom(src=>
{
DateTime?finalDate=null;
如果(src.HasDate==“N”)
{
//所以它应该是空的
}
其他的
{                                   
endResult=DateTime.Parse(src.Date.ToString());
}                               
返回最终日期;
}));
我得到的错误是:

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

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

Mapper.CreateMap<SomeViewModels, SomeDTO>()
             .ForMember(dest => dest.Date,
                        opt => opt.MapFrom(src => src.HasDate == "N" ? null : DateTime.Parse(src.Date.ToString())));
    
Mapper.CreateMap()
.FormMember(目标=>目标日期,
opt=>opt.MapFrom(src=>src.HasDate==“N”?null:DateTime.Parse(src.Date.ToString());
但如果我坚持保留第一个示例的结构,因为我有更复杂的if-else语句,第二个示例将无法满足,或者至少不太可读,该怎么办?

使用方法:

Mapper.CreateMap()
.ForMember(dest=>dest.Date,o=>o.resolvesusing(Converter));
专用静态对象转换器(SomeViewModels值)
{
DateTime?finalDate=null;
如果(value.Date.HasDate==“N”)
{
//所以它应该是空的
}
其他的
{                                   
finalDate=DateTime.Parse(value.Date.ToString());
}                               
返回最终日期;
}

以下是更多信息:

在最新版本的AutoMapper中,
ResolveUsing
已被删除。相反,请使用MapFrom的新重载:

void MapFrom<TResult>(Func<TSource, TDestination, TResult> mappingFunction);
void mappfrom(Func mappingFunction);
只需添加另一个lambda/function参数,即可分派到该新重载:

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

                    // mapping logic goes here

                    return destinationValue;
                }));
CreateMap()
.FormMember(dest=>dest.SomeDestProp,opt=>opt.MapFrom((src,dest)=>
{
TSomeDestProp目标值;
//映射逻辑在这里
返回destinationValue;
}));

因此我需要在转换器中定义其他属性映射,即使其余属性映射很简单?@Sum shortly-yes。但您可以在转换器中使用automapper来映射它,忽略此属性并手动设置:)日期属性是什么类型的?它是一个可为空的日期时间,在我的问题中忘了提到这一点。你能把这个例子(映射到automapper内部转换器)也添加到你的答案中吗?谢谢。@Sum我完全错了:)您可以将
resolvesusing
选项与方法一起使用!这容易多了@总结一下为什么这里是MapFrom需要一个lambda表达式,而您给了它一个lambda语句(一个带花括号的语句)。谢谢,这在ResolveUsing被删除后很有帮助!这太好了,谢谢。我不知道为什么这些例子在AutoMapper官方网站上不可用或很难找到。欢迎大家。在大多数情况下,我建议删除AutoMapper并编写手工编写的映射代码,或者最好先找到一种避免复制值的方法。
        CreateMap<TSource, TDest>()
                .ForMember(dest => dest.SomeDestProp, opt => opt.MapFrom((src, dest) =>
                {
                    TSomeDestProp destinationValue;

                    // mapping logic goes here

                    return destinationValue;
                }));