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