在复制的列表中通过反射设置 属性 更新原始列表
Setting a Property via Reflection in a copied List updates original list
我在 C# 代码中遇到问题,我确定它与我使用反射的方式有关,但我不确定如何解决它。
据我所知,如果我有:
List1 = List<MyClass>
并使用类似于
的语法
List2 = new List<MyClass>(List1);
那么 List2
应该是 List1
的副本,对其所做的任何更新都不应反映在原始列表中。
既然如此,考虑下面的测试代码:
public class Fake
{
public string MyVal { get; set; }
}
public List<Fake> List1;
public List<Fake> List2;
public void UpdateClassTest()
{
List1 = new List<Fake>() {new Fake() { MyVal = "hello" } };
List2 = new List<Fake>(List1);
string propName;
System.Type type = typeof(Fake);
foreach (System.Reflection.PropertyInfo pi in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
{
propName = pi.Name;
List2.ForEach(f => pi.SetValue(f, "Good Bye"));
}
}
当我 运行 这个 List1[0]
和 List2[0]
都更新为 "Good Bye" 时,但我会假设 List1
不会受到我对 List2
.
所做更改的影响
我哪里做错了或者没有理解这里?
new List(List other) 不做深拷贝。当您修改 [0] 中的项目时,它会修改存在于两个列表中的原始对象。
See this other question about implementing ICloneable.
复制列表意味着列表是不同的对象。列表包含的元素仍然相同。例如:
List1 = new List<Fake>() {new Fake { MyVal = "hello" } };
List2 = new List<Fake>(List1);
List2.Add(new Fake { MyVal = "hey" });
Console.WriteLine(List1.Length); // 1
Console.WriteLine(List2.Length); // 2
List2[0].MyVal = "hi";
Console.WriteLine(List1[0].MyVal) // hi
我在 C# 代码中遇到问题,我确定它与我使用反射的方式有关,但我不确定如何解决它。
据我所知,如果我有:
List1 = List<MyClass>
并使用类似于
的语法List2 = new List<MyClass>(List1);
那么 List2
应该是 List1
的副本,对其所做的任何更新都不应反映在原始列表中。
既然如此,考虑下面的测试代码:
public class Fake
{
public string MyVal { get; set; }
}
public List<Fake> List1;
public List<Fake> List2;
public void UpdateClassTest()
{
List1 = new List<Fake>() {new Fake() { MyVal = "hello" } };
List2 = new List<Fake>(List1);
string propName;
System.Type type = typeof(Fake);
foreach (System.Reflection.PropertyInfo pi in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
{
propName = pi.Name;
List2.ForEach(f => pi.SetValue(f, "Good Bye"));
}
}
当我 运行 这个 List1[0]
和 List2[0]
都更新为 "Good Bye" 时,但我会假设 List1
不会受到我对 List2
.
我哪里做错了或者没有理解这里?
new List(List other) 不做深拷贝。当您修改 [0] 中的项目时,它会修改存在于两个列表中的原始对象。
See this other question about implementing ICloneable.
复制列表意味着列表是不同的对象。列表包含的元素仍然相同。例如:
List1 = new List<Fake>() {new Fake { MyVal = "hello" } };
List2 = new List<Fake>(List1);
List2.Add(new Fake { MyVal = "hey" });
Console.WriteLine(List1.Length); // 1
Console.WriteLine(List2.Length); // 2
List2[0].MyVal = "hi";
Console.WriteLine(List1[0].MyVal) // hi