Search code examples
c#automapperautomapper-5

Mapping members with similar names Using Automapper


In a remote db, which I can only read, there are 24 columns in a row for each hour of day. Their names go as P1, P2, ..., P24.

I must copy the values to my own db, which I named column names as H1, H2, ..., H24.

How can I use auto mapper to map remote columns to locals ?

CreateMap<Data.Context.SomeTableFromRemoteDb, Data.Entity.MyTableInLocaldb>()
                .ForMember(x => x.H1, y => y.MapFrom(z => z.P1))
                .ForMember(x => x.H2, y => y.MapFrom(z => z.P2))
                .ForMember(x => x.H3, y => y.MapFrom(z => z.P3))
                .ForMember(x => x.H4, y => y.MapFrom(z => z.P4))
                .ForMember(x => x.H5, y => y.MapFrom(z => z.P5))
                .ForMember(x => x.H6, y => y.MapFrom(z => z.P6))
                .ForMember(x => x.H7, y => y.MapFrom(z => z.P7))
                .ForMember(x => x.H8, y => y.MapFrom(z => z.P8))
                .ForMember(x => x.H9, y => y.MapFrom(z => z.P9))
                .ForMember(x => x.H10, y => y.MapFrom(z => z.P10))
                 .ForMember(x => x.H11, y => y.MapFrom(z => z.P11))
                 .ForMember(x => x.H12, y => y.MapFrom(z => z.P12))
                 .ForMember(x => x.H13, y => y.MapFrom(z => z.P13))
                 .ForMember(x => x.H14, y => y.MapFrom(z => z.P14))
                 .ForMember(x => x.H15, y => y.MapFrom(z => z.P15))
                 .ForMember(x => x.H16, y => y.MapFrom(z => z.P16))
                 .ForMember(x => x.H17, y => y.MapFrom(z => z.P17))
                 .ForMember(x => x.H18, y => y.MapFrom(z => z.P18))
                 .ForMember(x => x.H19, y => y.MapFrom(z => z.P19))
                 .ForMember(x => x.H20, y => y.MapFrom(z => z.P20))
                 .ForMember(x => x.H21, y => y.MapFrom(z => z.P21))
                 .ForMember(x => x.H22, y => y.MapFrom(z => z.P22))
                 .ForMember(x => x.H23, y => y.MapFrom(z => z.P23))
                 .ForMember(x => x.H24, y => y.MapFrom(z => z.P24));

This is the current code. What I ask is can we convert it to something like this:

CreateMap<Data.Context.SomeTableFromRemoteDb, Data.Entity.MyTableInLocaldb>()
                    .ForMember(x => x.ReplaceMemberName(o=> o, "H", "P"), y => y.MapFrom(z => z.P1))

Automapper has a function with name replacemembername but It does not seem to be what I'm seeking.


Solution

  • You were alomst right about ReplaceMemberName, but used it a bit incorrectly. It should be applied to entire mapper configuration. See https://github.com/AutoMapper/AutoMapper/wiki/Configuration#replacing-characters for details.

        private static void Main(string[] args)
        {
            var a = new Class1
            {
                a1 = "1",
                a2 = "2",
                a3 = "3",
                a4 = "4",
                a5 = "5"
            };
    
            Mapper.Initialize(config =>
                {
                    config.ReplaceMemberName("a", "b");
                    config.CreateMap<Class1, Class2>();
                }
            );
    
            var b = Mapper.Map<Class1, Class2>(a);
        }
    
        private class Class1
        {
            public string a1;
            public string a2;
            public string a3;
            public string a4;
            public string a5;
        }
    
        private class Class2
        {
            public string b1;
            public string b2;
            public string b3;
            public string b4;
            public string b5;
        }
    

    You can also create local mapper like this:

    var config = new MapperConfiguration(c =>
    {
        c.ReplaceMemberName("a", "b");
        c.CreateMap<Class1, Class2>();
    });
    
    var mapper = config.CreateMapper();
    
    var b = mapper.Map<Class1, Class2>(a);