/// <summary> /// 复制对象成员 /// </summary> /// <param name="source">被复制的对象</param> /// <param name="target">要复制的对象</param> /// <param name="members">需要复制的成员</param> /// <param name="ignoreMembers">忽略复制的成员</param> public virtual void CopyMembers(object source, object target, string[] members, string[] ignoreMembers) { // 获取对象类型 Type type = source.GetType(); // 获取对象属性信息 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 && propertyInfo.CanWrite) { // 获取当前属性的GET访问器 MethodInfo getMethodInfo = propertyInfo.GetSetMethod(); // 获取当前属性的SET访问器 MethodInfo setMethodInfo = propertyInfo.GetSetMethod(); // 判断GET/SET访问器是否是公开的 if (getMethodInfo.IsPublic && setMethodInfo.IsPublic) { object value; // 判断GET访问器是否是静态访问器 if (getMethodInfo.IsStatic) { // 获取当前属性的静态值 value = propertyInfo.GetValue(null, null); } else { // 获取被复制对象当前属性的实例值 value = propertyInfo.GetValue(source, null); } // 判断SET访问器是否是静态访问器 if (setMethodInfo.IsStatic) { // 设置当前属性的静态值 propertyInfo.SetValue(null, value, null); } else { // 设置要复制对象当前属性的实例值 propertyInfo.SetValue(target, value, null); } } } } } // 获取对象字段信息 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 && !fieldInfo.IsLiteral && !fieldInfo.IsInitOnly) { // 判断当前字段是否是静态的 if (fieldInfo.IsStatic) { // 获取当前字段的静态值 object value = fieldInfo.GetValue(null); // 设置当前字段的静态值 fieldInfo.SetValue(null, value); } else { // 获取被复制对象当前字段的实例值 object value = fieldInfo.GetValue(source); // 设置要复制对象当前字段的实例值 fieldInfo.SetValue(target, value); } } } } }