我有一个ASP .Net核心应用程序。我只是试图让我的AutoMapper配置为根据此配置将字符串逗号转换为字符串列表:
configuration.CreateMap<Job, JobDto>()
.ForMember(dto => dto.Keywords, options => options.MapFrom(entity => entity.Keywords.Split(',').ToList()))
由于某种原因它没有编译并给我以下错误:
表达式树可能不包含使用可选参数的调用或调用
我不明白为什么我会收到这个错误。我很确定我之前在其他项目中做过这些,没有任何这样的错误。
这是完全正确的。
由于正在创建的表达式树将要包含一些更复杂的逻辑,例如.Split(',').ToList()
,它不是可访问的属性或方法,只支持顶级反射对象属性和方法(如类MemberInfo中),因此错误被大写。
属性链,深度调用(.obj1property.obj2property),表达式树不支持扩展方法,就像在.ToList()调用中一样。
我的解决方案是这样的:
// Execute a custom function to the source and/or destination types after member mapping
configuration.CreateMap<Job, JobDto>()
.AfterMap((dto,jobDto)=>jobDto.Keywords = dto.Keywords.Split(',').ToList());
我有同样的问题。我不知道这是不是一个问题。无论如何,我找到了一个解决方法。
CreateMap<Category, GetCategoryRest>()
.ForMember(dest => dest.Words,
opt => opt.MapFrom(src => ToWordsList(src.Words)));
private static List<string> ToWordsList(string words)
{
return string.IsNullOrWhiteSpace(words) ? new List<string>() : words.Split(",").ToList();
}
保证AutoMapper
始终是List
。不过,我很困惑。在我的Startup.cs
中,我定义AutoMapper
允许列表的空值。
Mapper.Initialize(cfg => {
cfg.AllowNullCollections = true;
}
Category.Words
是一个string
。 GetCategoryRest.Words
是一个List<string>
AutoMapper版本:8.1.1,AutoMapper.Microsoft.DependencyInjection:6.1.1