我有一个被转换object
为用于通用处理的值(结构实例)。我需要复制该值。我不能明确地这样做,因为我只是拥有它Type
并且不知道它在编译时是什么。
默认情况下,我会得到一份参考副本:var copy = objectOfMyStruct;
. 我考虑过制作一个显式的浅拷贝,MemberwiseClone()
但我不能这样做,因为它是受保护的方法,我不能修改MyStruct
.
Convert.ChangeType(objectOfMyStruct, typeOfMyStruct)
没有帮助,因为转换(实际上没有转换)发生在内部并且它再次返回 Object 。
我怎么能这样做?
编辑:
我需要制作一个副本以保留原始值,并且只需反序列化一个以传递给 OnChangeHandler。简化的实现是:
var oldValue = type.GetValue(reference);
var newValue = oldValue; // something better is needed here
Deserialize(type, stream, ref newValue);
OnChange(oldValue, newValue);
type.SetValue(reference, newValue);
之所以进行复制,是因为只发送了增量(更改),因此应将其应用于原始值。
编辑2:
此实现适用于原始类型,因此尽管 int 也被装箱,但我正在复制它而不是复制对它的引用。我只是不明白这一点。
这是所需内容的示例。
这个例子,你可以在LINQPad中测试,应该对结构进行克隆,而不将其转换回未装箱的类型,这样当通过实现的接口调用对其进行变异时,只有原始结构会发生变异。问题是这样的;我该如何编写克隆方法?
void Main()
{
object original = new Dummy { Property = 42, Field = "Meaning of life" };
object clone = Clone(original);
((IDummy)original).Mutate(); // will modify the boxed struct in-place
original.Dump();
// should output different if Clone did its job
clone.Dump();
}
static object Clone(object input)
{
return input;
}
public interface IDummy
{
void Mutate();
}
public struct Dummy : IDummy
{
public int Property { get; set; }
public string Field;
public void Mutate()
{
Property = 77;
Field = "Mutated";
}
}