7

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

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

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

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

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

4

4 回答 4

18

正如错误所说,Split 函数有一个可选参数。它的完整签名是这样(选项是可选的)

public string[] Split(string separator, StringSplitOptions options = StringSplitOptions.None)

当您尝试在表达式树中使用具有默认值的函数时,它会给您错误。要修复它,很简单,只需自己传递可选参数即可。( StringSplitOptions.None ) 所以,只需将其更改为:

entity.Keywords.Split(',' , StringSplitOptions.None).ToList()
于 2019-09-06T04:22:32.087 回答
7

这是完全正确的。

引发错误是因为正在创建的表达式树即将包含一些更复杂的逻辑,例如.Split(',').ToList()它不是可访问的属性或方法,仅支持顶级反射对象属性和方法(如在 class 中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());
于 2019-02-25T01:29:38.433 回答
2

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

 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

于 2019-06-13T06:02:07.533 回答
-1

使用.AfterMap

 CreateMap<src, dto>()
                .ForMember(src =>src.Categories,options=> options.Ignore())
                .AfterMap((src, dto) => { dto.Categories.AddRange(src.Categories.Split(",").ToList()); })
                .ReverseMap()
                .ForMember(src => src.Categories, option => option.MapFrom(dto => string.Join(",", dto.Categories)));
于 2020-07-31T07:58:21.350 回答