【问题标题】:Automapper mapping string to List<string>Automapper 将字符串映射到 List<string>
【发布时间】:2020-03-05 21:38:09
【问题描述】:

我有两节课

 public class SourceClass
{
    public Guid Id { get; set; }
    public string Provider { get; set; }
}


public class DestinationClass
{
    public Guid Id { get; set; }
    public List<string> Provider { get; set; }
}

我已经使用以下代码初始化了我的映射

CreateMap<SourceClass, DestinationClass>();

然后在我的控制器中,我有:

Mapper.Map<List<DestinationClass>>(requests)

其中“requests”是传递给我的控制器的 SourceClass 对象的列表。

我的问题是,如何将 SourceClass 中的 Provider(字符串类型)映射到 Destination 类中 List 类型的 Provider?

源类中的提供者将始终是单个字符串,而目标类中的提供者将始终是单个字符串的列表。

这是我在映射配置中尝试过的:

CreateMap<SourceClass, DestinationClass>().ForMember(destinationMember => destinationMember.Provider,
                memberOptions => memberOptions.MapFrom(src => {
                return string.IsNullOrEmpty(src.Provider) ? [""] : src.Provider.ToList());

【问题讨论】:

  • 你能用英语描述字符串如何映射到字符串列表吗?它会变成一个包含该单个字符串的列表吗?
  • @Amy 正确,所以如果我的源类中的字符串是“Test”,那么它应该是我的目标类中的 ["Test"]。
  • 你到底遇到了什么问题?
  • @TylerHundley 我不太确定该怎么做,所以我尝试使用 .ForMember 和三元运算符,但无法理解为什么它不起作用。
  • 如果字符串为空或空,它是一个空列表吗?或者它是一个空列表?或者列表是否包含空字符串?

标签: c# conditional-statements automapper


【解决方案1】:

首先,我建议将您的目标属性重命名为 Providers 以避免混淆/表示它是一个集合。那你可以试试这个

CreateMap<SourceClass, DestinationClass>()
  .ForMember(destinationMember => destinationMember.Providers,
  memberOptions => memberOptions.MapFrom(src => new List<string> {src.Provider ?? ""}));

特别是这一位

src => new List<string> {src.Provider ?? ""}

使用一个值创建一个新的字符串类型列表,src.Provider,或者如果为空,则为空字符串。

【讨论】:

    【解决方案2】:

    如果您将源成员的 Provider 属性转换为 List,您将获得一个 char 类型的 List。 此代码应反映您的需要。

    CreateMap<SourceClass, DestinationClass>()
    .ForMember(
        destinationMember => destinationMember.Provider,
        memberOptions => memberOptions.MapFrom(
            src => string.IsNullOrEmpty(src.Provider) ? new List<string>() { "" } : new List<string> { src.Provider }
        )
    );
    

    【讨论】:

      【解决方案3】:

      用这个替换你的映射配置:

      CreateMap<SourceClass, DestinationClass>()
        .ForMember(destinationMember => destinationMember.Provider,
        memberOptions => memberOptions
          .MapFrom(src => 
          { 
            return new List<string>{ string.IsNullOrEmpty(src.Provider) ? "" : src.Provider)
          });
      

      【讨论】:

      • 多行代码应该使用三个反引号或在每行前加上四个空格来格式化。单反引号用于内联代码。
      猜你喜欢
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      相关资源
      最近更新 更多