自动生成automapper的configure匹配规则(一)【复杂类型属性解析】

之前的项目中大量的用到了automapper的模型间的数据匹配,可是由于数据的特殊性,自动匹配有时候满足不了要求,于是自己做了一个可视化的手动匹配工具。

这是一个通用的工具,能把复杂的模型解析出来。

首先,先做了一个解析复杂类的方法

using System;
using System.Collections.Generic;
using System.Linq;
using KDY.Common.Entities.Orders;

namespace KDY.Common.ModelMapper.libs
{
    /// 
    /// 获取类型属性列表
    /// 
    public class GetTypeList
    {
        private readonly Dictionary _dictType;
        private readonly Dictionary> _dicClassProperties;

        /// 
        /// 构造函数中初始化变量
        /// 
        public GetTypeList()
        {
            _dicClassProperties=new Dictionary>();
            // 自定义简单类型的解析
            _dictType = new Dictionary
            {
                {typeof (string), "string"},
                {typeof (int), "int"},
                {typeof (double), "double"},
                {typeof (decimal), "decimal"},
                {typeof (long), "long"},
                {typeof (bool), "bool"},
                {typeof (byte[]), "byte[]"},
                {typeof (DateTime), "DateTime"},
                {typeof (DateTime?), "DateTime?"},
                {typeof (List), "List"}
            };
        }

        /// 
        /// 提取类型中的属性列表
        /// 
        /// 类型
        /// 所有复杂类型的属性列表
        public Dictionary> ExtractTypeList(Type type)
        {
            // 暂存的属性名称列表
            List propertyNameList = new List();

            // 遍历属性名
            type.GetProperties().ToList().ForEach(pro =>
            {
                if (pro.PropertyType == typeof (OrmLocaleValue)) return;

                if (!_dictType.ContainsKey(pro.PropertyType)
                    &&!_dicClassProperties.ContainsKey(pro.PropertyType.Name)
                    &&pro.PropertyType.Name != "ObservableCollection`1")
                {
                    var temp = pro.PropertyType;
                    ExtractTypeList(temp);
                }

                // 对特殊的list集合进行特殊解析
                // 例如:类中有一个复杂属性的集合,那么我们需要提取出集合中的复杂类型进行解析
                // 在automapper中,会自动对集合中的类型进行解析
                if (pro.PropertyType.Name == "ObservableCollection`1")
                {
                    var genericArgTypes = pro.PropertyType.GetGenericArguments();
                    ExtractTypeList(genericArgTypes[0]);
                }
                propertyNameList.Add(pro.Name);
            });

            // 最终结果
            _dicClassProperties.Add(type.Name, propertyNameList);
            return _dicClassProperties;
        }
    }
}

这个方法只是简单的分类递归而已,理解起来并不复杂。但是这个方法的作用却很冥想


有了这个方法,得到属性列表之后,操作就只是匹配生成代码,让对应的属性名匹配起来。


下一步操作会在第二篇中详细讲解。




你可能感兴趣的:(c#,wpf,automapper)