void DeepCopyObj <T> (T oSource , T nSource)
{
PropertyInfo[] props = typeof(T).GetPropertise();
foreach(PropertyInfo p in p.where(o => o.DeclaringType == typeof(T)))
{
if (p.CanWrite)
p.SetValue(nSource , p.GetValue(oSource , null ) , null);
}
}
代码如上,简单的利用反射拷贝对象,当传递进去的对象的属性中包含List、Dictionary时,List类型都可以正常拷贝,为什么Dictionary类型的拷贝不了,输出的nSouce中,字典类型的为null(源oSource中是有数据的)
自己调试解决了。并非以上深拷贝代码问题,问题出在要拷贝的对象,如果其属性声明采用非简化的set、get声明方式,必须写全。否则调System.Reflection.SetValue就是赋值不了的
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Nmae = "name";
Dictionary<int, string> Dic = new Dictionary<int, string>();
Dic.Add(1, "1");
Dic.Add(2, "2");
person.Dic = Dic;
Person person1 = new Person();
DeepCopyObj<Person>(person, person1);
}
static void DeepCopyObj<T>(T oSource, T nSource)
{
PropertyInfo[] props = nSource.GetType().GetProperties();
foreach (PropertyInfo p in props)
{
if (p.CanWrite)
p.SetValue(nSource, p.GetValue(oSource, null), null);
}
}
}
public class Person
{
public string Nmae { get; set; }
public Dictionary<int,string> Dic { get; set; }
}
Dictionary是可以的,DeepCopyObj 是按照你的改的
多谢你的关注,问题已解决,属性本身声明的问题。