从平面对象映射两个接口属性

时间:2016-10-25 21:25:44

标签: automapper

我有一个扁平对象,它包含多个属性,我想映射到嵌套对象的不同对象。为了使事情更有趣,我的嵌套对象是接口的,其中一些共享相同的接口。

在有人进入“接口是为了行为”并且我不应该在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。

0 个答案:

没有答案