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

Moh*_*ehr 5 automapper asp-net-core-spa-services

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

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

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

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

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

小智 13

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

public string[] Split(string separator, StringSplitOptions options = StringSplitOptions.None)
Run Code Online (Sandbox Code Playgroud)

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

entity.Keywords.Split(',' , StringSplitOptions.None).ToList()
Run Code Online (Sandbox Code Playgroud)


Art*_*fin 8

这是完全正确的。

引发错误是因为正在创建的表达式树将包含一些更复杂的逻辑,例如.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());
Run Code Online (Sandbox Code Playgroud)