【发布时间】:2019-01-09 23:57:40
【问题描述】:
我已经阅读了一堆关于 C# 对象克隆的代码。
出于某些原因,我想使用反射来执行克隆。
我有一个包含简单数据的对象(int、string、List<string>、List<int>、DateTime、double 或其他简单值类型)。该对象是通过简单的装箱创建的。
object ob = 5;
现在使用this DeepCloneHelper 或this one 之类的代码都会以同样的方式失败。在包含原始数据的对象上使用此克隆代码,它们将返回相同的对象。以下示例代码将返回 ob2,即 ReferenceEqual to ob1
object ob1 = 5;
object ob2 = DoSomeClone(ob1);
如何为此类类型编写简单的克隆代码?
我也在这里搜索了很多,所以如果这个问题是重复的,我很抱歉。
说明: 我有一个通用对象,它包含一些数据和引用(数据的来源)。纯数据本身(数据类型见上文)保存在一个对象中。对于原始类型,它只是装箱的值。
在某些情况下,我需要外部类的副本,因为我想将此函数提供给可能会更改数据的模拟。对象本身是通过构造函数克隆的。现在我也需要一份数据副本。使用任何克隆函数都会创建一个副本,而不是值的克隆。
【问题讨论】:
-
您能告诉我们为什么需要这样做吗?您无法更改被装箱的原始类型,因为它是不可变的。
-
为了清楚起见,你不能有一个装箱列表,除非你说的列表类型与
List<T>不同。List<T>不是值类型。 -
你想做什么?
List和string绝对不是简单类型,它们也不会被装箱——它们是引用类型,所以它们不需要装箱。另一方面,值类型在传递时会被复制。 -
@Kirill 对于原语来说并不重要,因为它们是不可变的。如果 OP 意味着 writable structs
-
@PanagiotisKanavos:虽然原语本身是不可变的,但在某些语言(不是 C#,除了通过反射)中可以更改“框中的值”。因此,虽然这是一个不寻常的请求,但在某些情况下是合理的。