一、对象转换为字典:
/// <summary> /// 转换对象为字典 /// </summary> /// <param name="obj">要转换的对象</param> /// <param name="members">需要转换的成员</param> /// <param name="ignoreMembers">忽略转换的成员</param> /// <returns>返回字典</returns> public virtual Dictionary<string, object> ConvertDictionary(object obj, string[] members, string[] ignoreMembers) { // 创建目标字典 Dictionary<string, object> dictionary = new Dictionary<string, object>(); // 获取对象类型 Type type = obj.GetType(); // 获取成员字段 FieldInfo[] fieldInfos = type.GetFields(); // 遍历成员字段,添加要转换的成员字段到字典中 foreach (FieldInfo fieldInfo in fieldInfos) { // 获取当前字段名 string name = fieldInfo.Name; // 判断当前字段是否需要转换 if ((members == null || members.Length <= 0 || members.Contains("*") || members.Contains(name)) && (ignoreMembers == null || ignoreMembers.Length <= 0 || (!ignoreMembers.Contains("*") && !ignoreMembers.Contains(name)))) { // 判断当前字段是否是公开的 if (fieldInfo.IsPublic) { // 判断当前字段是否是静态的 if (fieldInfo.IsStatic) { // 获取成员字段的静态值并设置到字典中 dictionary[name] = fieldInfo.GetValue(null); } else { // 获取成员字段的实例值并设置到字典中 dictionary[name] = fieldInfo.GetValue(obj); } } } } // 获取成员属性 PropertyInfo[] propertyInfos = type.GetProperties(); // 遍历成员属性,添加要转换的成员属性到字典中 foreach (PropertyInfo propertyInfo in propertyInfos) { // 获取当前属性名 string name = propertyInfo.Name; // 判断当前属性是否需要转换 if ((members == null || members.Length <= 0 || members.Contains("*") || members.Contains(name)) && (ignoreMembers == null || ignoreMembers.Length <= 0 || (!ignoreMembers.Contains("*") && !ignoreMembers.Contains(name)))) { // 判断当前属性是否可读的并且是简单的类型 if (propertyInfo.CanRead) { // 获取当前属性的GET访问器 MethodInfo methodInfo = propertyInfo.GetGetMethod(); // 判断当前属性的GET访问器是否是公开的 if (methodInfo.IsPublic) { // 判断当前属性的GET访问器是否是静态的 if (methodInfo.IsStatic) { // 获取成员属性的静态值并设置到字典中 dictionary[name] = propertyInfo.GetValue(null, null); } else { // 获取成员属性的实例值并设置到字典中 dictionary[name] = propertyInfo.GetValue(obj, null); } } } } } // 返回字典 return dictionary; }
二、字典转换为对象:
/// <summary> /// 转换字典为对象 /// </summary> /// <param name="type">对象类型</param> /// <param name="dictionary">要转换的字典</param> /// <param name="members">需要转换的成员</param> /// <param name="ignoreMembers">忽略转换的成员</param> /// <returns>返回对象</returns> public virtual object ConvertDictionary(Type type, Dictionary<string, object> dictionary, string[] members, string[] ignoreMembers) { // 创建目标对象 object obj = Activator.CreateInstance(type); // 遍历字典,添加要转换的数据到对象成员中 foreach (KeyValuePair<string, object> item in dictionary) { // 获取成员名称 string name = item.Key; // 判断当前成员是否需要转换 if ((members == null || members.Length <= 0 || members.Contains("*") || members.Contains(name)) && (ignoreMembers == null || ignoreMembers.Length <= 0 || (!ignoreMembers.Contains("*") && !ignoreMembers.Contains(name)))) { // 获取当前成员名称对应的数据 object value = item.Value; // 根据当前成员名称获取成员属性 PropertyInfo propertyInfo = type.GetProperty(name); // 判断是否有对应名称的成员属性 if (propertyInfo == null) { // 根据当前列名获取成员字段 FieldInfo fieldInfo = type.GetField(name); // 判断成员字段是否存在并且是否是公开可写的 if (fieldInfo != null && fieldInfo.IsPublic && !fieldInfo.IsLiteral && !fieldInfo.IsInitOnly) { // 根据成员字段类型转换数据类型 value = this.ConvertType(value, fieldInfo.FieldType); // 判断数据转换是否成功 if (value != null) { // 判断成员字段是否是静态的 if (fieldInfo.IsStatic) { // 设置成员字段的静态值 fieldInfo.SetValue(null, value); } else { // 设置成员字段的实例值 fieldInfo.SetValue(obj, value); } } } } else { // 判断成员属性是否可写 if (propertyInfo.CanWrite) { // 获取成员属性的SET访问器 MethodInfo methodInfo = propertyInfo.GetSetMethod(); // 判断成员属性的SET访问器是否是公开的 if (methodInfo.IsPublic) { // 根据成员属性类型转换数据类型 value = this.ConvertType(value, propertyInfo.PropertyType); // 判断数据转换是否成功 if (value != null) { // 判断成员属性的SET访问器是否是静态的 if (methodInfo.IsStatic) { // 设置成员属性的静态值 propertyInfo.SetValue(null, value, null); } else { // 设置成员属性的实例值 propertyInfo.SetValue(obj, value, null); } } } } } } } // 返回目标对象 return obj; }