关于C#中通用对象成员复制的说明

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

发表评论