C# 利用反射拷贝类

Posted 盘子脸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 利用反射拷贝类相关的知识,希望对你有一定的参考价值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;


namespace ReflectTools
{
    class Program
    {
        static void Main(string[] args)
        {
            Person a = new Person
            {
                Name = "盘子脸1号",

                Info = new Details
                    {
                        IsIT = false,
                        IsMarriage = true,
                        Code = "Hello world 那是不可能的 草泥马"
                    },
                PersonInfo = new CodeWorker
                {
                    Describe = "我是一个快乐的程序员"
                }
            };


            PersonVI vi = Program.CloneClass<PersonVI>(a);



            Console.ReadLine();
        }

        public static T CloneClass<T>(Object sourceObj) where T : class,new()
        {
            Type type = typeof(T);
            object targetObj = Activator.CreateInstance(type);
            Type targetType = targetObj.GetType();
            Type sourceType = sourceObj.GetType();

            CloneWork(sourceType, targetType, sourceObj, targetObj);

            return (T)targetObj;
        }

        public static void CloneWork(Type sourceType, Type targetType, object sourceObj, object targetObj)
        {
            FieldInfo[] info = sourceType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            FieldInfo targetInfo = null;
            object val = null;
            for (int i = 0; i < info.Length; i++)
            {
                targetInfo = targetType.GetField(info[i].Name);
                if (targetInfo == null)
                {
                    Console.WriteLine(info[i].Name + " 没找到");
                    continue;
                }

                if (targetInfo.FieldType.IsClass)
                {
                    if (!(targetInfo.FieldType.Name == "String" || targetInfo.FieldType.FullName == "System.String"))
                    {
                        if (targetInfo.GetValue(targetObj) == null)
                        {
                            targetInfo.SetValue(targetObj, Activator.CreateInstance(targetInfo.FieldType));
                        }

                        //说明是普通的类
                        CloneWork(info[i].GetValue(sourceObj).GetType(), targetInfo.FieldType, info[i].GetValue(sourceObj), targetInfo.GetValue(targetObj));
                    }
                }


                if (targetInfo != null)
                {
                    val = info[i].GetValue(sourceObj);
                    targetInfo.SetValue(targetObj, val);
                }
            }
        }

    }




    public class Person
    {
        public string Name;

        public Details Info;
        public CodeWorker PersonInfo;
    }

    public class Details
    {
        public bool IsMarriage;

        public bool IsIT;

        public String Code;
    }
    public class CodeWorker
    {
        public String Describe;
    }



    public class PersonVI
    {
        public string Name;
        public Details Info;
        public CodeWorker PersonInfo;
    }


}

以上是关于C# 利用反射拷贝类的主要内容,如果未能解决你的问题,请参考以下文章

noncopyable禁止拷贝类

对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀

C#利用反射来判断对象是否包含某个属性的实现方法

C#利用反射来判断对象是否包含某个属性的实现方法

[C++11 类的改进] --- 继承控制:=default和=delete

C#利用反射实现两个类的对象之间相同属性的值的复制