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

}
时间: 2024-11-10 13:19:27

C# 利用反射拷贝类的相关文章

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

对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀 性能对比: BeanCopier > PropertyUtils > BeanUtils. 其中BeanCopier的性能高出另外两个100数量级. BeanCopier使用可参考: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp36 对象拷贝的应用现状简介: 业务系统中经常需要两个对象进行属性的拷贝,不能否认逐个的对象拷贝是最快速最

利用反射实现工厂模式

需求:工厂类根据参数生成对应类的实例. 示例: RoomParts.cs namespace ReflectionFactory { /// <summary> /// 屋子产品的零件 /// </summary> public enum RoomParts { Roof, Window, Pillar } } ProductAttribute.cs using System; namespace ReflectionFactory { /// <summary> //

利用反射动态操作数组

java语言中,数组对象并不是从某个类实例化出来的,而是JVM动态创建的.对数组对象使用如下操作,可看到数组对应的Class对象.通过RTTI(Run-Time Type Information)可直接检查数组的运行时类型,以及它的签名.下方的 "[L"就是int[]/Integer[] 的运行类型. 1 Integer[] integers = (Integer[]) Array.newInstance(Integer.class,4); 2 System.out.println(i

C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值

转自goldeneyezhang原文 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值总结: 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): Type t = tc.GetType();//获得该类的Type //再用Type.GetProperties获得PropertyInfo[],然后就可以用foreach 遍历了 foreach (PropertyInfo pi

利用反射实现通用的excel导入导出

如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 1 package com.bean; 2 3 public class Book { 4 private int id; 5 private String name; 6 private String type; 7 // public int a; 8 9 public String getType() { 10 System.ou

利用反射代替switch -转

原文地址:http://www.cnblogs.com/vipsoft/archive/2012/10/19/2731126.html 根据传进来不同的值,调用不同的方法 protected void btn_SwitchClick(object sender, EventArgs e) { string result = ""; switch (ddlMethod.SelectedValue) { case "A": result = SwitchTest.Get

【WindowsPhone】利用反射初始化和添加 SQLite数据库

首先引用命名空间 using System.Reflection 了解一下 Assembly 类 // // 摘要: // 表示一个程序集,它是一个可重用.无版本冲突并且可自我描述的公共语言运行时应用程序构造块. public abstract class Assembly 我们把Model类都约定好放在同一个命名空间下,下面以User类为例: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 u

MVVM下 利用反射动态创建ViewModel 实现单例

在MVVM一般情况下都会希望ViewModel 在整个应用程序中只有一份实例 传统的做法是用单例模式去实现 : public class ViewModelTest { private ViewModelTest() { } private static ViewModelTest viewModelInstace; public static ViewModelTest GetViewModelTestInstace() { if (viewModelInstace == null) { vi

利用反射+多态替换条件语句

/*利用反射+多态替换条件语句*/ class Program { public static void Main(string[] args) { /* * 用户发送一个命令,让代码去指定Commander * * <?xml version="1.0" encoding="utf-8" ?><Command><CommandType>Start</CommandType></Command> */ //