AutoMapper:映射到由接口定义的嵌套对象中包含的私有设置器

AutoMapper: Mapping to private setters contained in nested objects defined by Interfaces

我创建了一个反映我遇到的问题的控制台应用程序。 我想:

  1. 能够映射到只读属性(具有私有 setters 的属性)
  2. 这些属性是否在嵌套对象中
  3. 将那些嵌套对象声明为其父对象中的接口 class

我似乎无法同时获得以上所有内容。这是示例代码:

using AutoMapper;
using System;

namespace ConsoleApp5
{
    class Program
    {
        static void Main(string[] args)
        {
            var dbCvg = new DbCoverage("123", "b", "blue", new DbChild(5, 9));

            var config = new MapperConfiguration(cfg => {
                cfg.CreateMap<IDbCoverage, Coverage>();
                cfg.CreateMap<IDbChild, IChild>();
            });

            var mapper = new Mapper(config);

            var destClass = mapper.Map<Coverage>(dbCvg);

            Console.WriteLine(destClass.ExternalMemberId);
            Console.WriteLine(destClass.CoverageCode);
            Console.WriteLine(destClass.ReadOnlyDesc);

            Console.WriteLine(destClass.Child.someValue);
            Console.WriteLine(destClass.Child.readOnlyValue);
        }
    }

    public interface IDbCoverage
    {
        string ExternalMemberId { get; set; }
        string CoverageCode { get; set; }
        string ReadOnlyDesc { get; }
        IDbChild Child { get; set; }
    }


    public interface IDbChild
    {
        int someValue { get; set; }
        int readOnlyValue { get; }
    }

    public interface ICoverage
    {
        string ExternalMemberId { get; set; }
        string CoverageCode { get; set; }
        string ReadOnlyDesc { get; }
        IChild Child { get; set; }
    }

    public interface IChild
    {
        int someValue { get; set; }
        int readOnlyValue { get; }
    }

    public class Coverage : ICoverage
    {
        public string ExternalMemberId { get; set; }
        public string CoverageCode { get; set; }
        public string ReadOnlyDesc { get; private set; }
        public IChild Child { get; set; } 
    }

    public class Child : IChild
    {
        public int someValue { get; set; }
        public int readOnlyValue { get; private set; }
    }

    public class DbCoverage : IDbCoverage
    {
        public string ExternalMemberId { get; set; }
        public string CoverageCode { get; set; }
        public string ReadOnlyDesc { get; private set; }
        public IDbChild Child { get; set; }

        public DbCoverage(string Id, string code, string desc, IDbChild child)
        {
            ExternalMemberId = Id;
            CoverageCode = code;
            ReadOnlyDesc = desc;
            Child = child;
        }
    }

    public class DbChild : IDbChild
    {
        public int someValue { get; set; }
        public int readOnlyValue { get; private set; }

        public DbChild(int smVal, int roVal)
        {
            someValue = smVal;
            readOnlyValue = roVal;
        }
    }
}

运行时我们可以看到输出的最后一行是 0 而不是 9,因为 9 没有被映射。 这是因为映射来自 IDbChild -> IChild 并且 IChild 没有 属性 的 setter。

但是,如果我改为尝试映射 IDbChild -> Child,我会得到一个编译错误,我认为这是因为 Coverage 对象中嵌套的 Child 属性 被定义为一个接口,因此它需要一个 IDbChild -> IChild 映射。

有什么方法可以更改映射配置(但不是底层对象)以使其正常工作?

映射接口只会使事情复杂化。但这是可能的。

    cfg.CreateMap<IDbChild, Child>();
    cfg.CreateMap<IDbChild, IChild>().As<Child>();

https://docs.automapper.org/en/latest/Mapping-inheritance.html