AutoMapper:映射到由接口定义的嵌套对象中包含的私有设置器
AutoMapper: Mapping to private setters contained in nested objects defined by Interfaces
我创建了一个反映我遇到的问题的控制台应用程序。
我想:
- 能够映射到只读属性(具有私有 setters 的属性)
- 这些属性是否在嵌套对象中
- 将那些嵌套对象声明为其父对象中的接口 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
我创建了一个反映我遇到的问题的控制台应用程序。 我想:
- 能够映射到只读属性(具有私有 setters 的属性)
- 这些属性是否在嵌套对象中
- 将那些嵌套对象声明为其父对象中的接口 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