EmitMapper的使用

转载:http://www.cnblogs.com/aaa6818162/archive/2012/06/21/2557879.html

EmitMapper是一个开源实体映射框架,地址:http://emitmapper.codeplex.com/

      EmitMapper映射效率比较高,接近硬编码。EmitMapper采用emit方式在运行时动态生成IL,而其他映射框架多是采用反射机制。此外EmitMapper最大限度地减少了拆箱装箱操作和映射过程中的额外的调用。
      EmitMapper支持.net的所有平台:Framework 3.5、Microsoft Silverlight 3、Mono。
 
      EmitMapper的使用非常简单,不需要指定任何的映射策略。系统会采用默认的映射配置器DefaultMapConfig完成映射操作。
 
//=>一、(默认映射配置器)属性名称一样的情况;类型可以不一样,但基元素类型转换可以进行ToString。(注意是属性名称是区分大小写)
            //=》写法一
            //ObjectsMapper<Sourse, Dest> mapper =
            //ObjectMapperManager.DefaultInstance.GetMapper<Sourse, Dest>();
            //Dest dst = mapper.Map(src);

            //=》简写二
            Dest dst = null;
            dst = ObjectMapperManager.DefaultInstance.GetMapper<Sourse, Dest>().Map(src, dst);

            //=》二、自定义映射配置器
            ObjectsMapper<Sourse, Dest> mapper1 =
                new ObjectMapperManager().GetMapper<Sourse, Dest>
                (
                 new DefaultMapConfig()
                .IgnoreMembers<Sourse, Dest>(new string[] { "A" })
                .NullSubstitution<decimal?, decimal>((value) => { return -1M; }) //如果不是语句块,则可以省略return;如果是加上return,则需要加上花括号 { return }
                //.NullSubstitution<decimal?, decimal>((value) =>  -1M)
                .ConvertUsing<Inner, Inner2>(value => new Inner2 { D12 = value.D1, D22 = value.D2 })
                //.ConvertUsing<Inner, Inner2>(value => { return new Inner2 { D12 = value.D1, D22 = value.D2 }; })
                //=>方法体的写法
                //.PostProcess<Dest>((value, state) =>
                //{
                //    value.F = "nothing";
                //    value.A = 111;
                //    return value;
                //})
                //);
                //=>return的写法
                //.PostProcess<Dest>((value, state) =>
                //{
                //    return new Dest
                //    {
                //        F = "nothing",
                //        A = 111,
                //    };
                //})
                //.PostProcess<Dest>((value, state) =>
                //    new Dest
                //    {
                //        F = "noting",
                //        A = 111,
                //    })
                //);
                .PostProcess<Dest>((Dest value, object state) =>
                    new Dest
                    {
                        F = "noting",
                        A = 111,
                    })
                );
            Dest dst1 = mapper1.Map(src);

            //=>其他
            //=>委托写法
            //EmitMapper.MappingConfiguration.MappingOperations.ValuesPostProcessor<Dest> ValuesPostProcessor1 = delegate(Dest dest1, object state) { return new Dest { }; };
            EmitMapper.MappingConfiguration.MappingOperations.ValuesPostProcessor<Dest> ValuesPostProcessor2 = (d, s) => { return new Dest { }; };
View Code

EmitMapper的使用小结(很不错)

http://www.cnblogs.com/ariklee/p/3833598.html

 

自己总结的Demo下载:

https://files.cnblogs.com/files/zfanlong1314/EmitMapperComponent.zip

 

Customization using default configurator

Customization overview
Custom converters
Custom converters_for_generics
Null substitution
Ignoring members
Custom constructors
Shallow and_deep_mapping
Names matching
Post processing

posted @ 2015-04-22 14:04  跟着阿笨一起玩.NET  阅读(992)  评论(0编辑  收藏  举报