【问题标题】:Map Different Concrete Types to Collection of Interface将不同的具体类型映射到接口集合
【发布时间】:2020-01-03 08:01:02
【问题描述】:

我很难将不同的具体类型映射到 automapper 中的单个接口集合。例如:

域:

public interface INameInterface {
    string Name;
}

public class FullName: INameInterface {
    string Name;
}

public class FirstNameOnly: INameInterface {
    string Name;
}

public class MyDomain {
    List<INameInterface> Names;
}

DTO:

public class NameDTO {
    int NameType;
    string Name;
}

public class MyDTO {
    List<NameDTO> NameDTOs;
}

我想将 MyDTO 映射到 MyDomain。我想通过其 NameType 解析 NameDTO 并将 NameTypes 1 映射到 Fullname 并将 2 映射到 FirstNameOnly 具体类并将它们放在 MyDomain.Names 集合中。我怎样才能在自动映射器中做到这一点。

非常感谢任何帮助。

PS。例子被简化了

【问题讨论】:

标签: c# .net automapper dto


【解决方案1】:

这可以使用自定义类型转换器来解决。

在自动映射器配置中:

cfg.CreateMap<NameDTO, INameInterface>()
                    .ConvertUsing<SomeConverter>();

然后创建自定义转换器类。

public class SomeConverter : ITypeConverter<NameDTO, INameInterface>
{
    public INameInterface Convert(NameDTO source, INameInterface destination, ResolutionContext context)
    {
        if (source.NameType == 0)
        {
            return context.Mapper.Map<FullName>(source);
        }
        if (source.NameType == 1)
        {
            return context.Mapper.Map<FirstNameOnly>(source);
        }

        return context.Mapper.Map<FirstNameOnly>(source);
    }
}

只需为每个具体类型添加必要的映射即可。

警告,我曾尝试在投影中使用这种方法,但这不起作用,因为它无法转换为表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2018-11-16
    • 2020-03-07
    • 2011-11-13
    相关资源
    最近更新 更多