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# 利用反射拷贝类的更多相关文章

  1. 【转】利用反射快速给Model实体赋值

    原文地址:http://blog.csdn.net/gxiangzi/article/details/8629064 试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有 ...

  2. 静态代理和利用反射形成的动态代理(JDK动态代理)

    代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...

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

    如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...

  4. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  5. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

  6. Atitit利用反射获取子类 集合 以及继承树

    Atitit利用反射获取子类 集合 以及继承树 想从父类往下找子类的确是不可能的,要知道只要类不是final的话谁都有继承它的自由不需要事前通知父类. Eclipse实现不是重父类开始找而是重子类往回 ...

  7. C#回顾 - 8.利用反射动态创建对象

    拿微信消息返回的示例数据实验 var data = "<xml><ToUserName><![CDATA[toUser]]></ToUserName ...

  8. <五>JDBC_利用反射及JDBC元数据编写通用的查询方法

    此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...

  9. C# 利用反射

    .NET基础篇——反射的奥妙 C#获取实体类属性名和值 | 遍历类对象 c#通过反射获取类上的自定义特性 C#利用反射+特性实现简单的实体映射数据库操作类

随机推荐

  1. [BZOJ3167][P4099][HEOI2013]SAO(树形DP)

    题目描述 Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...

  2. BZOJ 1150 [CTSC2007]数据备份Backup(贪心+优先队列)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1150 [题目大意] 给出n个数,请你挑出k对(每个数不可重复选取),使得他们差的绝对值 ...

  3. [xsy2123]毛毛虫

    题意:有一棵带点权的树,链修改是把$(x,y)$这条链和与其相邻的节点都加上一个数,查询是问$(x,y)$这条链和与其相邻的节点的权值和 学到了一个新姿势? 考虑树链剖分,在剖重链时每次给当前节点的儿 ...

  4. 【回文自动机】bzoj3676 [Apio2014]回文串

    回文自动机讲解!http://blog.csdn.net/u013368721/article/details/42100363 pam上每个点代表本质不同的回文子串.len(i)代表长度,cnt(i ...

  5. 【分块】【树套树】bzoj2141 排队

    考虑暴力更新的情况,设swap的是L,R位置的数.swap之后的逆序对数应该等于:之前的逆序对数+[L+1,R-1]中比 L位置的数 大的数的个数-[L+1,R-1]中比 L位置的数 小的数的个数-[ ...

  6. JDK源码学习笔记——Iterable/Iterator实现原理

    Collection接口继承java.lang.Iterable接口,集合类重写了iterator()方法 public interface Iterable<T> { Iterator& ...

  7. Problem E: 零起点学算法84——数组中删数II

    #include<stdio.h> int main() { ],b[],i,flag=; while(scanf("%d",&n)!=EOF) { ;i< ...

  8. Nginx配置自签名的SSL证书(转载)

    要保证Web浏览器到服务器的安全连接,HTTPS几乎是唯一选择.HTTPS其实就是HTTP over SSL,也就是让HTTP连接建立在SSL安全连接之上. SSL使用证书来创建安全连接.有两种验证模 ...

  9. iptables复习记忆

    inner_net="10.0.0.0/8,192.168.0.0/16" int_if="eth0" ext_if="eth1" 一.基本 ...

  10. 【JSP EL】使用EL表达式比较 动态选中 select中的option

    <option value="${k.key }" ${KPIThis.parent.parent.thisId == k.key ? "selected" ...