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