zoukankan      html  css  js  c++  java
  • NetCore AutoMapper的封装

     

     需要引用AutoMapper的Nuget包
     如果需要忽略某个字段就在字段上面打标签如下:

     [IgnoreMap]
     public string IgnoreValue { get; set; }

        /// <summary>
        /// 对象映射
        /// </summary>
        public static class Extensions
        {
            /// <summary>
            /// 同步锁
            /// </summary>
            private static readonly object Sync = new object();
    
            /// <summary>
            /// 将源对象映射到目标对象
            /// </summary>
            /// <typeparam name="TSource">源类型</typeparam>
            /// <typeparam name="TDestination">目标类型</typeparam>
            /// <param name="source">源对象</param>
            /// <param name="destination">目标对象</param>
            public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination)
            {
                return MapTo<TDestination>(source, destination);
            }
    
            /// <summary>
            /// 将源对象映射到目标对象
            /// </summary>
            /// <typeparam name="TDestination">目标类型</typeparam>
            /// <param name="source">源对象</param>
            public static TDestination MapTo<TDestination>(this object source) where TDestination : new()
            {
                return MapTo(source, new TDestination());
            }
    
            /// <summary>
            /// 将源对象映射到目标对象
            /// </summary>
            private static TDestination MapTo<TDestination>(object source, TDestination destination)
            {
                if (source == null)
                    throw new ArgumentNullException(nameof(source));
                if (destination == null)
                    throw new ArgumentNullException(nameof(destination));
                var sourceType = GetType(source);
                var destinationType = GetType(destination);
                var map = GetMap(sourceType, destinationType);
                if (map != null)
                    return Mapper.Map(source, destination);
                lock (Sync)
                {
                    map = GetMap(sourceType, destinationType);
                    if (map != null)
                        return Mapper.Map(source, destination);
                    InitMaps(sourceType, destinationType);
                }
                return Mapper.Map(source, destination);
            }
    
            /// <summary>
            /// 获取类型
            /// </summary>
            private static Type GetType(object obj)
            {
                var type = obj.GetType();
                if ((obj is System.Collections.IEnumerable) == false)
                    return type;
                if (type.IsArray)
                    return type.GetElementType();
                var genericArgumentsTypes = type.GetTypeInfo().GetGenericArguments();
                if (genericArgumentsTypes == null || genericArgumentsTypes.Length == 0)
                    throw new ArgumentException("泛型类型参数不能为空");
                return genericArgumentsTypes[0];
            }
    
            /// <summary>
            /// 获取映射配置
            /// </summary>
            private static TypeMap GetMap(Type sourceType, Type destinationType)
            {
                try
                {
                    return Mapper.Configuration.FindTypeMapFor(sourceType, destinationType);
                }
                catch (InvalidOperationException)
                {
                    lock (Sync)
                    {
                        try
                        {
                            return Mapper.Configuration.FindTypeMapFor(sourceType, destinationType);
                        }
                        catch (InvalidOperationException)
                        {
                            InitMaps(sourceType, destinationType);
                        }
                        return Mapper.Configuration.FindTypeMapFor(sourceType, destinationType);
                    }
                }
            }
    
            /// <summary>
            /// 初始化映射配置
            /// </summary>
            private static void InitMaps(Type sourceType, Type destinationType)
            {
                try
                {
                    var maps = Mapper.Configuration.GetAllTypeMaps();
                    Mapper.Initialize(config => {
                        ClearConfig();
                        foreach (var item in maps)
                            config.CreateMap(item.SourceType, item.DestinationType);
                        config.CreateMap(sourceType, destinationType);
                    });
                }
                catch (InvalidOperationException)
                {
                    Mapper.Initialize(config => {
                        config.CreateMap(sourceType, destinationType);
                    });
                }
            }
    
            /// <summary>
            /// 清空配置
            /// </summary>
            private static void ClearConfig()
            {
                var typeMapper = typeof(Mapper).GetTypeInfo();
                var configuration = typeMapper.GetDeclaredField("_configuration");
                configuration.SetValue(null, null, BindingFlags.Static, null, CultureInfo.CurrentCulture);
            }
    
            /// <summary>
            /// 将源集合映射到目标集合
            /// </summary>
            /// <typeparam name="TDestination">目标元素类型,范例:Sample,不要加List</typeparam>
            /// <param name="source">源集合</param>
            public static List<TDestination> MapToList<TDestination>(this System.Collections.IEnumerable source)
            {
                return MapTo<List<TDestination>>(source);
            }
        }
    

      

  • 相关阅读:
    Android最佳性能实践(二)——分析内存的使用情况
    Android最佳性能实践(一)——合理管理内存
    Java反射机制
    Java基础知识总结之IO流
    Java之IO流详解
    CentOS 6.4安装中文支持
    because it violates the following Content Security Policy directive: "default-src 'self'". Note that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.错误应该怎么解决?
    在asp.net添加引用Microsoft.VisualBasic全过程
    SQL SERVER 2012安装介质
    Microsoft SQL Server附加数据库错误:5123
  • 原文地址:https://www.cnblogs.com/sunqiang/p/9629700.html
Copyright © 2011-2022 走看看