Automapper 和处理空属性
Automapper and dealing with null properties
我的映射设置如下:
CreateMap<SourceClass, DestinationClass>().ForMember(destinationMember => destinationMember.Provider,
memberOptions => memberOptions.MapFrom(src => src.Providers.FirstOrDefault()));
我从 SourceClass 中的列表映射到目标中的字符串 class。
我的问题是,如何处理 "Providers" 为空的情况?
我试过使用:
src?.Providers?.FirstOrDefault()
但我收到一条错误消息,提示我不能在 lambda 中使用 null 传播器。
我一直在阅读 Automapper,但仍然不确定 AM 是否会自动处理 null 情况。我尝试构建表达式树,但无法看到任何提供附加信息的信息。
如果有帮助,我正在使用 automapper v 6.1.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()));
这将允许您在将来需要切换逻辑或做更复杂的事情时更改值转换器。
编辑
由于您使用的是旧版本,您可以使用 private/static/extension 方法来做同样的事情。所以像
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)));
为了可读性,我通常更喜欢这样做而不是在事情变得更复杂时内联做一些事情
尝试使用 AutoMapper 中的 NullSubstitution 选项
你可以阅读 here
我的映射设置如下:
CreateMap<SourceClass, DestinationClass>().ForMember(destinationMember => destinationMember.Provider,
memberOptions => memberOptions.MapFrom(src => src.Providers.FirstOrDefault()));
我从 SourceClass 中的列表映射到目标中的字符串 class。
我的问题是,如何处理 "Providers" 为空的情况?
我试过使用:
src?.Providers?.FirstOrDefault()
但我收到一条错误消息,提示我不能在 lambda 中使用 null 传播器。
我一直在阅读 Automapper,但仍然不确定 AM 是否会自动处理 null 情况。我尝试构建表达式树,但无法看到任何提供附加信息的信息。
如果有帮助,我正在使用 automapper v 6.1.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()));
这将允许您在将来需要切换逻辑或做更复杂的事情时更改值转换器。
编辑
由于您使用的是旧版本,您可以使用 private/static/extension 方法来做同样的事情。所以像
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)));
为了可读性,我通常更喜欢这样做而不是在事情变得更复杂时内联做一些事情
尝试使用 AutoMapper 中的 NullSubstitution 选项 你可以阅读 here