利用反射实现深拷贝,为什么拷贝不了字典类型

2019-11-26 18:16发布

问题:

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中是有数据的)

回答1:

自己调试解决了。并非以上深拷贝代码问题,问题出在要拷贝的对象,如果其属性声明采用非简化的set、get声明方式,必须写全。否则调System.Reflection.SetValue就是赋值不了的



回答2:

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 是按照你的改的