我有一个扁平对象,它包含多个属性,我想映射到嵌套对象的不同对象。为了使事情更有趣,我的嵌套对象是接口的,其中一些共享相同的接口。
在有人进入“接口是为了行为”并且我不应该在em中拥有属性之前,我必须指定这是一个我必须使用的旧代码库,并且无法对其进行重大更改。< / p>
我搜索了SO以寻找为单一类型提供两个映射的方法,但我发现的解决方案并不涉及在相同的上下文中使用它们。
这是我想要映射的简化示例:
using AutoMapper;
using System;
namespace AutoMapInterfaces
{
class Program
{
static void Main(string[] args)
{
ConfigureMappings();
var source = new NestedProducts
{
Product1 = new ProductA { Enabled = true, Name = "1" },
Product2 = new ProductA { Enabled = false, Name = "2" },
};
var products = Mapper.Map<FlatProducts>(source);
Console.WriteLine("Product1 ({0}) State : {1}", products.Product1Name, products.Product1Enabled);
Console.WriteLine("Product2 ({0}) State : {1}", products.Product2Name, products.Product2Enabled);
var destination = Mapper.Map<NestedProducts>(products);
Console.WriteLine("Product1 ({0}) State : {1}", destination.Product1.Name, destination.Product1.Name);
Console.WriteLine("Product2 ({0}) State : {1}", destination.Product2.Name, destination.Product2.Name);
}
private static void ConfigureMappings()
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<NestedProducts, FlatProducts>();
cfg.CreateMap<FlatProducts, NestedProducts>()
.ForMember(dest => dest.Product1,
opt => opt.MapFrom(src => src))
.ForMember(dest => dest.Product2,
opt => opt.MapFrom(src => src));
// Maybe ?
//cfg.CreateMap<FlatProducts, IProduct>().ConvertUsing<FlatToNestedProductsConverter>();
});
}
}
public interface IProduct
{
bool Enabled { get; set; }
string Name { get; set; }
}
public class ProductA : IProduct
{
public bool Enabled { get; set; }
public string Name { get; set; }
}
public class NestedProducts
{
public IProduct Product1 { get; set; }
public IProduct Product2 { get; set; }
}
public class FlatProducts
{
public bool Product1Enabled { get; set; }
public string Product1Name { get; set; }
public bool Product2Enabled { get; set; }
public string Product2Name { get; set; }
}
}
我不知道接下来该怎么做,我尝试了ValueResolver和TypeConverter,但在两个实例中均未能区分Product1和Product2。