使用Automapper将多个集合映射到单个集合

时间:2012-05-30 13:32:49

标签: automapper automapper-2

我可以使用以下代码将同一类型的集合映射到单个集合。

AutoMapper.Mapper.CreateMap<Source, Destination>().ForMember(
                dest => dest.Drivers,
                opt => opt.MapFrom(src => src.BikeDrivers.Concat(src.CarDrivers).Concat(src.TruckDrivers))); 

通过上述解决方案,我可以将所有三种类型的驱动程序映射到一个集合中。 我的目标对象(Driver)有一个名为DriverType的属性,它有助于识别驱动程序的类型。 (BikeDriver / CarDriver / TruckDriver)

在上面的代码中,我如何根据我添加的集合设置DriverType属性。

例如:我必须硬编码

DriverType = CarDrivers集合项目的CarDriver DriverType = BikeDriverfor BikeDrivers集合项。

提前致谢

1 个答案:

答案 0 :(得分:1)

要设置DriverType属性,您必须在源对象中具备此知识。我看不到你的大图,但这可能用作样本

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var s = new Source()
                        {
                            BikeDrivers = new List<BikeDriver>() {new BikeDriver()},
                            CarDrivers = new List<CarDriver>() {new CarDriver()},
                            TruckDrivers = new List<TruckDriver>() {new TruckDriver()},
                        };

            var d = new Destination();


            AutoMapper.Mapper.CreateMap<Source, Destination>().ForMember(
                dest => dest.Drivers,
                opt => opt.MapFrom(src => src.BikeDrivers.Concat<IDriver>(src.CarDrivers).Concat<IDriver>(src.TruckDrivers)));

            var result = AutoMapper.Mapper.Map(s, d);
        }

        public class Driver : IDriver
        {
            public string DriverType { get; set; }
        }

        public class Destination
        {
            public IEnumerable<IDriver> Drivers { get; set; }
        }

        public class Source
        {
            public IEnumerable<BikeDriver> BikeDrivers { get; set; }
            public IEnumerable<CarDriver> CarDrivers { get; set; }
            public IEnumerable<TruckDriver> TruckDrivers { get; set; }
        }

        public interface IDriver
        {
            string DriverType { get; set; }
        }

        public class BikeDriver : IDriver
        {
            public string DriverType
            {
                get { return "BikeDriver"; }
                set { throw new NotImplementedException(); }
            }
        }
        public class CarDriver : IDriver
        {
            public string DriverType
            {
                get { return "CarDriver"; }
                set { throw new NotImplementedException(); }
            }
        }
        public class TruckDriver : IDriver
        {
            public string DriverType
            {
                get { return "TruckDriver"; }
                set { throw new NotImplementedException(); }
            }
        }
    }
}