我想要一个真正的深拷贝.在Java中,这很容易,但是你如何在C#中做到这一点?
我在C#中有一个通用的对象列表,并希望克隆列表.列表中的项目是可复制的,但似乎没有选项可做list.Clone()
.
有一个简单的方法吗?
可能重复:
如何在.Net(特别是C#)中深层复制对象?
请看下面的代码(摘自C#书):
public class MyClass
{
public int val;
}
public struct myStruct
{
public int val;
}
public class Program
{
private static void Main(string[] args)
{
MyClass objectA = new MyClass();
MyClass objectB = objectA;
objectA.val = 10;
objectB.val = 20;
myStruct structA = new myStruct();
myStruct structB = structA;
structA.val = 30;
structB.val = 40;
Console.WriteLine("objectA.val = {0}", objectA.val);
Console.WriteLine("objectB.val = {0}", objectB.val);
Console.WriteLine("structA.val = {0}", structA.val);
Console.WriteLine("structB.val = {0}", structB.val);
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道它会产生下面的输出
objectA.val …
Run Code Online (Sandbox Code Playgroud) 我正在尝试建立一个读取器,它将从各种网站中获取JSON对象(想想信息抓取)并将它们转换为C#对象.我目前正在使用JSON.NET进行反序列化过程.我遇到的问题是它不知道如何处理类中的接口级属性.所以有些本质:
public IThingy Thing
Run Code Online (Sandbox Code Playgroud)
会产生错误:
无法创建IThingy类型的实例.Type是接口或抽象类,无法实例化.
让它成为ITINGy而不是Thingy是相对重要的,因为我正在处理的代码被认为是敏感的,单元测试非常重要.对于像Thingy这样的完全成熟的对象,不可能对原子测试脚本的对象进行模拟.它们必须是一个接口.
我一直在研究JSON.NET的文档已有一段时间了,我在这个网站上找到的与此相关的问题都来自一年多以前.有帮助吗?
此外,如果重要,我的应用程序是用.NET 4.0编写的.
我有一节课:
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有两个Person实例(person1和person2).我想将person2的内容复制到person1.我想在一个指令中制作此副本,而不是按属性制作属性:
person1.LastName = person2.LastName;
Run Code Online (Sandbox Code Playgroud)
在doc中,我看到将对象复制到另一个对象但类型不同.如何在类型相同时复制对象?
我想制作一个LINQ to XML XElement的深层副本.我想这样做的原因是文档中有一些节点我想创建(在同一文档中)的修改副本.我没有看到这样做的方法.
我可以将元素转换为XML字符串然后重新解析它,但我想知道是否有更好的方法.
当我做了某乙以下..任何人修改一个(我以为这样做会克隆从人,将B).我也不知道如果更改Person a将在链接后更改Person b.由于我的代码现在,我只能在一个方向看到这个.
Person a = new Person() { head = "big", feet = "small" };
Person b = a;
b.head = "small"; //now a.head = "small" too
Run Code Online (Sandbox Code Playgroud)
现在如果我这样做了.人a变得完全分开.
Person b = new Person() { head = a.head, feet = a.feet };
Run Code Online (Sandbox Code Playgroud)
现在,将此行为与C#中的其他内容进行比较时,这种方法很有意义.但是,对于大型物体,这可能会非常烦人.
有没有办法简化这个?
如:
Person b = a.Values;
假设我有一节课:
class obj
{
int a;
int b;
}
Run Code Online (Sandbox Code Playgroud)
然后我有这个代码:
obj myobj = new obj(){ a=1, b=2}
obj myobj2 = myobj;
Run Code Online (Sandbox Code Playgroud)
现在上面的代码引用了第一个obj.我想要的是myobj2
指副本中myobj
没有反映在原文中的副本.我搜索了SO,到目前为止解决方案似乎很复杂.有没有更简单的方法来做到这一点.我正在使用.net 4.5
几天前,我回答了一个关于SO 的有趣问题HashSet<T>
.一个可能的解决方案涉及克隆hashset,在我的回答中我建议做这样的事情:
HashSet<int> original = ...
HashSet<int> clone = new HashSet<int>(original);
Run Code Online (Sandbox Code Playgroud)
虽然这种方法非常简单,但我怀疑它的效率非常低:新构造函数HashSet<T>
需要单独添加原始hashset中的每个项目,并检查它是否已经存在.这显然是浪费时间:因为源集合是a ISet<T>
,所以保证不包含重复项.应该有办法利用这些知识......
理想情况下,HashSet<T>
应该实施ICloneable
,但遗憾的是并非如此.我还检查了Reflector,看看如果HashSet<T>
源集合是一个哈希集,构造函数是否做了特定的事情,但事实并非如此.它可能可以通过在私有字段上使用反射来完成,但这将是一个丑陋的黑客......
那么,有人提出了一个更有效地克隆哈希集的聪明解决方案吗?
(请注意,这个问题纯粹是理论上的,我不需要在真实的程序中这样做)
c# ×7
.net ×5
clone ×4
object ×2
automapper ×1
cloning ×1
copy ×1
deep-copy ×1
generics ×1
hashset ×1
json ×1
json.net ×1
linq-to-xml ×1
list ×1
performance ×1
reference ×1
shallow-copy ×1