一、对象转换为字典:
/// <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;
}