首页 > 代码库 > C# 利用反射拷贝类
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# 利用反射拷贝类
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。