c# - Automapper 和处理空属性
问题描述
我的映射设置如下:
CreateMap<SourceClass, DestinationClass>().ForMember(destinationMember => destinationMember.Provider,
memberOptions => memberOptions.MapFrom(src => src.Providers.FirstOrDefault()));
我从 SourceClass 中的 List 映射到目标类中的字符串。
我的问题是,我该如何处理“Providers”为空的情况?
我试过使用:
src?.Providers?.FirstOrDefault()
但我收到一条错误消息,说我不能在 lambda 中使用空传播器。
我一直在阅读 Automapper 并且仍然不确定 AM 是否自动处理 null 情况。我尝试构建表达式树,但看不到任何提供附加信息的信息。
如果有帮助,我正在使用 automapper v 6.1.1。
解决方案
您可以尝试使用带有 AutoMapper的ValueConverter 。这可能看起来像这样
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)));
为了可读性,我通常更喜欢这样做而不是内联,因为事情变得更加复杂