/// <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);
}
}
}
}
}