我的映射设置如下:
CreateMap<SourceClass, DestinationClass>().ForMember(destinationMember => destinationMember.Provider,
memberOptions => memberOptions.MapFrom(src => src.Providers.FirstOrDefault()));
我要从SourceClass中的列表映射到目标类中的字符串。
我的问题是,如何处理“提供者”为null的情况?
我尝试使用:
src?.Providers?.FirstOrDefault()
但是我收到一条错误消息,说我不能在lambda中使用空传播子。
我一直在阅读Automapper,但仍不确定AM是否会自动处理空值。我尝试构建表达式树,但看不到任何提供其他信息的信息。
如果有帮助,我正在使用automapper v 6.1.1。
答案 0 :(得分:1)
您可以尝试将ValueConverter与AutoMapper一起使用。可能看起来像这样
public class ListFormatter : IValueConverter<string, List<string>>
{
public List<string> Convert(string source)
{
if (source != null)
{
return new List<string> { source };
}
return new List<string>();
}
}
然后您可以像这样使用它
CreateMap<SourceClass, DestinationClass>()
.ForMember(destinationMember => destinationMember.Provider,
memberOptions => memberOptions.ConvertUsing(new ListFormatter()));
如果您需要切换逻辑或执行更复杂的操作,则可以在将来更改值转换器。
修改
由于您使用的是旧版本,因此可以使用私有/静态/扩展方法执行相同的操作。像
List<string> ConvertStringToList(string source)
{
if (source != null)
{
return new List<string> { source };
}
return new List<string>();
}
然后这样称呼
CreateMap<SourceClass, DestinationClass>()
.ForMember(destinationMember => destinationMember.Provider,
memberOptions => memberOptions.MapFrom(src => ConvertStringToList(src.Provider)));
出于可读性考虑,通常我倾向于这样做,而不是内联,因为事情变得越来越复杂
答案 1 :(得分:1)
尝试使用AutoMapper中的NullSubstitution选项 您可以阅读here