编程知识 购物 网址 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
   -> .NET新手区 -> c# AutoMapper 使用方式 -> 正文阅读

[.NET新手区]c# AutoMapper 使用方式

安装方式:使用vs自带的nuget管理工具,搜索AutoMapper ,选择第一个安装到你的项目即可。
我从网上找了一些资料,
参考网址:http://blog.csdn.net/csethcrm/article/details/52934325
下载了个demo,然后自己又写了一遍,我把AutoMapper 的使用分为两种:
1、viewmodel与实体的字段名字是一致的,viewmodel的字段可以比实体中的字段少,但是不能多。 
还有一种情况是:源实体中的字段名字是Getxxx,那么viewmodel中对应的字段可以是xxx,也会自动对应赋值,比如我写的demo中源实体中GetA,viewmodel中的A;
再有一种情况就是实体中的实体赋值,在我写的这个例子中,源实体中包含的实体类字段为Sub,里面包含的字段名字为Age,
那么destmodel中对应的字段名字可以是:SubAge,那么automapper就可以自动为你赋值了,大家看最后的运行结果。
给大家看下我建的源实体:

    public class Source1
    {
        public string Name { set; get; }

        public string GetA { set; get; }
        public string GetD { set; get; }


        public string SetB { set; get; }

        public string c { set; get; }

        public SubSource1 Sub { set; get; }
    }


    public class SubSource1
    {
        public string Age { set; get; }

    }

还有viewmodel(要转化成为你想要的模型):

    public class Dest1
    {
        public string Name { set; get; }

        public string A { set; get; }

        public string C { set; get; }

        public string SubAge { set; get; }

        public string D { set; get; }
    }

我封装的扩展方法:

        /// <summary>
        ///  类型映射,默认字段名字一一对应
        /// </summary>
        /// <typeparam name="TDestination">转化之后的model,可以理解为viewmodel</typeparam>
        /// <typeparam name="TSource">要被转化的实体,Entity</typeparam>
        /// <param name="source">可以使用这个扩展方法的类型,任何引用类型</param>
        /// <returns>转化之后的实体</returns>
        public static TDestination MapTo<TDestination, TSource>(this TSource source) 
            where TDestination:class 
            where TSource :class 
        {
            if (source == null) return default(TDestination);
            var config = new MapperConfiguration(cfg => cfg.CreateMap<TDestination, TSource>());
            var mapper = config.CreateMapper();
            return mapper.Map<TDestination>(source);
        }

使用方式:

                var source1 = new Source1
                {
                    Name = "source",
                    Sub = new SubSource1 { Age = "25" },
                    c = "c",
                    GetA = "A",
                    SetB = "B"
                };

                var destViewModel = source1.MapTo<Dest1, Source1>();

运行结果:

 
2.viewmodel与实体字段名字没有全部对应,只有几个字段的名字和源实体中的字段名字是一样的,其他的字段是通过实体中的几个字段组合或者是格式或者是类型转化而来的,
使用方法:不能再使用这个扩展方法了,只能自己额外写代码,代码如下:

               var config2 = new MapperConfiguration(
                    cfg => cfg.CreateMap<SourceUser, DestUser2>()
                        .ForMember(d => d.DestName, opt => opt.MapFrom(s => s.Name))    //指定字段一一对应
                        .ForMember(d => d.Birthday, opt => opt.MapFrom(src => src.Birthday.ToString("yy-MM-dd HH:mm")))//指定字段,并转化指定的格式
                        .ForMember(d => d.Age, opt => opt.Condition(src => src.Age > 5))//条件赋值
                        .ForMember(d => d.A1, opt => opt.Ignore())//忽略该字段,不给该字段赋值
                        .ForMember(d => d.A1, opt => opt.NullSubstitute("Default Value"))//如果源字段值为空,则赋值为 Default Value
                        .ForMember(d => d.A1, opt => opt.MapFrom(src => src.Name + src.Age * 3 + src.Birthday.ToString("d"))));//可以自己随意组合赋值
                var mapper2 = config2.CreateMapper();

注释中都包含了平时常用的几种情况,其他的我就没有再写。
下面再给大家把list转化的扩展方法代码贴上:

        /// <summary>
        /// 集合列表类型映射,默认字段名字一一对应
        /// </summary>
        /// <typeparam name="TDestination">转化之后的model,可以理解为viewmodel</typeparam>
        /// <typeparam name="TSource">要被转化的实体,Entity</typeparam>
        /// <param name="source">可以使用这个扩展方法的类型,任何引用类型</param>
        /// <returns>转化之后的实体列表</returns>
        public static IEnumerable<TDestination> MapToList<TDestination, TSource>(this IEnumerable<TSource> source)
            where TDestination : class
            where TSource : class
        {
            if (source == null) return new List<TDestination>();
            var config = new MapperConfiguration(cfg => cfg.CreateMap<TDestination, TSource>());
            var mapper = config.CreateMapper();
            return mapper.Map<List<TDestination>>(source);
        }

同样的使用方式:

                var source1 = new Source1
                {
                    Name = "source",
                    Sub = new SubSource1 { Age = "25" },
                    c = "c",
                    GetA = "A",
                    SetB = "B"
                };
var source3 = new Source1
                {
                    Name = "source3",
                    Sub = new SubSource1 { Age = "253" },
                    c = "c3",
                    GetA = "A3",
                    SetB = "B3"
                };
                var sourceList = new List<Source1> { source1, source3 };
                var destViewModelList = sourceList.MapToList<Dest1, Source1>();

运行结果:


以上就是我个人所得,如有错误,欢迎大家指正。
  .NET新手区 最新文章
将ZIP文件添加到程序集资源文件然后在运行时
Web服务的调用
.NET创建WebService服务简单的例子
多线程编程学习笔记——任务并行库(三)
序列化和反序列化
Spring学习之路
多线程(2)Thread
五小步让VS Code支持AngularJS智能提示
Log4net入门(SQL篇)
C#十五子游戏
上一篇文章           查看所有文章
加:2017-12-03 23:21:39  更:2017-12-03 23:21:42 
 
360图书馆 软件开发 购物精选 智慧山 阅读网 日历 万年历 2021年3日历
2021/3/6 23:02:28
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  编程知识