c# - AutoMapper 和继承 - 如何映射?

标签 c# inheritance automapper

有这个场景:

public class Base {  public string Name; }

public Class ClassA :Base {  public int32 Number;  }

public Class ClassB :Base { public string Description;}

public Class DTO {
  public string Name;
  public int32 Number;
  public string Description;
}

我有一个 IList<Base> 我的 map 是:

AutoMapper.Mapper.CreateMap<IList<Base>, IList<DTO>>()
   .ForMember(dest => dest.Number, opt => opt.Ignore())
   .ForMember(dest => dest.Description, opt => opt.Ignore());

AutoMapper.Mapper.CreateMap<ClassA, DTo>()
   .ForMember(dest => dest.Description, opt => opt.Ignore());

AutoMapper.Mapper.CreateMap<ClassB, DTO>()
   .ForMember(dest => dest.Number, opt => opt.Ignore())

Mapper.AssertConfigurationIsValid(); //Is OK!

但是当我这样做时,ClassA 或 ClassB 中的属性不会被映射:

IList<DTO>= AutoMapper.Mapper.Map<IList<Base>,IList<DTO>>(baseList);

如何映射 ClasA 中定义的属性和 ClassB

最佳答案

您需要像这样创建与您的域类匹配的 DTO 类:

public class DTO
{
    public string Name;
}

public class DTO_A : DTO
{
    public int Number { get; set; }
}

public class DTO_B : DTO
{
    public string Description { get; set; }
}

然后您需要将映射更改为:

        Mapper.CreateMap<Base, DTO>()
            .Include<ClassA, DTO_A>()
            .Include<ClassB, DTO_B>();

        Mapper.CreateMap<ClassA, DTO_A>();

        Mapper.CreateMap<ClassB, DTO_B>();

        Mapper.AssertConfigurationIsValid();

完成此操作后,将执行以下操作:

        var baseList = new List<Base>
        {
            new Base {Name = "Base"},
            new ClassA {Name = "ClassA", Number = 1},
            new ClassB {Name = "ClassB", Description = "Desc"},
        };

        var test = Mapper.Map<IList<Base>,IList<DTO>>(baseList);
        Console.WriteLine(test[0].Name);
        Console.WriteLine(test[1].Name);
        Console.WriteLine(((DTO_A)test[1]).Number);
        Console.WriteLine(test[2].Name);
        Console.WriteLine(((DTO_B)test[2]).Description);
        Console.ReadLine();

不幸的是,这确实意味着您有一个不需要的类型转换,但我认为您对此无能为力。

关于c# - AutoMapper 和继承 - 如何映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3348634/

相关文章:

c++ - 如何在基类中定义仅适用于派生类的方法?

c# - 带有 DbContext 多级 Include() 的 AutoMapper ProjectTo

c# - System.Environment.Exit(0) 防止 hockeyapp 注册崩溃

java - JPA - 我可以使用@DiscriminatorValue 创建一个没有自己的表的实体类吗?

c# - iTextSharp 是否支持 Windows Metro 应用程序?

c# - 继承或标识符

c# - Entity Framework 无法保存我的更改

c# - 使用 AutoMapper 从接口(interface)推断目标类型

C# Excel 互操作 - 从 Range 中删除第一行

c# - 按键 + 列表中的值对 Dictionary<int, List<int>> 进行排序