在 AutoMapper 问题中使用 string.Split()
Using string.Split() in AutoMapper issue
我有一个 ASP .Net 核心应用程序。我只是想让我的 AutoMapper 配置为根据此配置将逗号分隔的字符串转换为字符串列表:
configuration.CreateMap<Job, JobDto>()
.ForMember(dto => dto.Keywords, options => options.MapFrom(entity => entity.Keywords.Split(',').ToList()))
由于某种原因,它没有被编译并给我以下错误:
An expression tree may not contain a call or invocation that uses
optional argument
我不明白为什么会出现此错误。我很确定我之前在我的其他项目中也这样做过,没有任何这样的错误。
完全正确。
出现错误是因为正在创建的表达式树将包含一些更复杂的逻辑,例如 .Split(',').ToList()
、这不是可访问的 属性 或方法,仅支持顶级反射对象属性和方法(如 class MemberInfo
)。
属性 链接、深度调用 (.obj1属性.obj2属性)、表达式树不支持扩展方法,如 .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
如错误所述,Split 函数有一个可选参数。它的完整签名是这样的(选项是可选的)
public string[] Split(string separator, StringSplitOptions options = StringSplitOptions.None)
当您尝试在表达式树中使用具有默认值的函数时,它会报错。
要修复它,很简单,只需自己传递可选参数即可。 ( StringSplitOptions.None )
所以,只需将其更改为:
entity.Keywords.Split(',' , StringSplitOptions.None).ToList()
使用.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)));
我有一个 ASP .Net 核心应用程序。我只是想让我的 AutoMapper 配置为根据此配置将逗号分隔的字符串转换为字符串列表:
configuration.CreateMap<Job, JobDto>()
.ForMember(dto => dto.Keywords, options => options.MapFrom(entity => entity.Keywords.Split(',').ToList()))
由于某种原因,它没有被编译并给我以下错误:
An expression tree may not contain a call or invocation that uses optional argument
我不明白为什么会出现此错误。我很确定我之前在我的其他项目中也这样做过,没有任何这样的错误。
完全正确。
出现错误是因为正在创建的表达式树将包含一些更复杂的逻辑,例如 .Split(',').ToList()
、这不是可访问的 属性 或方法,仅支持顶级反射对象属性和方法(如 class MemberInfo
)。
属性 链接、深度调用 (.obj1属性.obj2属性)、表达式树不支持扩展方法,如 .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
如错误所述,Split 函数有一个可选参数。它的完整签名是这样的(选项是可选的)
public string[] Split(string separator, StringSplitOptions options = StringSplitOptions.None)
当您尝试在表达式树中使用具有默认值的函数时,它会报错。 要修复它,很简单,只需自己传递可选参数即可。 ( StringSplitOptions.None ) 所以,只需将其更改为:
entity.Keywords.Split(',' , StringSplitOptions.None).ToList()
使用.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)));