在AutoMapper问题中使用string.Split()

问题描述 投票:1回答:2

我有一个ASP .Net核心应用程序。我只是试图让我的AutoMapper配置为根据此配置将字符串逗号转换为字符串列表:

configuration.CreateMap<Job, JobDto>()
                .ForMember(dto => dto.Keywords, options => options.MapFrom(entity => entity.Keywords.Split(',').ToList()))

由于某种原因它没有编译并给我以下错误:

表达式树可能不包含使用可选参数的调用或调用

我不明白为什么我会收到这个错误。我很确定我之前在其他项目中做过这些,没有任何这样的错误。

automapper asp-net-core-spa-services
2个回答
0
投票

这是完全正确的。

由于正在创建的表达式树将要包含一些更复杂的逻辑,例如.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());

0
投票

我有同样的问题。我不知道这是不是一个问题。无论如何,我找到了一个解决方法。

 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是一个stringGetCategoryRest.Words是一个List<string>

AutoMapper版本:8.1.1,AutoMapper.Microsoft.DependencyInjection:6.1.1

© www.soinside.com 2019 - 2024. All rights reserved.