我想将值从一个对象复制到另一个对象.类似于传递值但具有赋值的东西.
例如:
PushPin newValPushPin = oldPushPin; //I want to break the reference here.
Run Code Online (Sandbox Code Playgroud)
有人告诉我为此写一个拷贝构造函数.但是这个类有很多属性,手工编写复制构造函数可能需要一个小时.
注意:Silverlight中不提供ICloneable.
我在SO处找到了许多解决方案,而且是通过序列化/反序列化(进入内存和后退)来处理对象的深层克隆.
它要求克隆的类标记为[Serializable].我碰巧把我的类(大部分都是)标记为[DataContract]因为我使用DataContractSerializer序列化为XML.
我只介绍了[Serializable]属性,因为需要对其中一些类实例进行深度克隆.但是,现在通过DCS进行序列化/反序列化的事情发生了,因为它不再起作用了 - 关于在反序列化时期望不同的XML元素的错误.如果我删除了[Serializable]错误消失了.
我有什么选择?我只想尽可能简单地深入克隆我的对象.
我正在为Unity实现一个深度对象复印机.
我在这里找到了这个很好的序列化/反序列化方法:https://stackoverflow.com/a/78612/3324388
但是我遇到了MonoBehaviour对象.如果类型是GameObject,我需要使用Instantiate而不是序列化.所以我添加了一张支票:
if (typeof(T) == typeof(GameObject))
{
GameObject clone = Instantiate(source as GameObject);
T returnClone = clone as T;
return returnClone;
}
Run Code Online (Sandbox Code Playgroud)
我可以将源代码转换为GameObject(使用as),但是当我尝试反向执行时,它会失败
type参数
T不能与as参数一起使用,因为它没有类类型约束,也没有"类"约束.
如果我尝试将它像:
if (typeof(T) == typeof(GameObject))
{
GameObject clone = Instantiate(source as GameObject);
T returnClone = (T)clone;
return returnClone;
}
Run Code Online (Sandbox Code Playgroud)
无法将GameObject转换为类型
T
我觉得我很接近但是我不能完全正确地进行投射.你知道我错过了什么让这个工作吗?
c# serialization deep-copy unity-game-engine deserialization
我创建了一个名为Colors的类.我在Colors对象上设置了某些属性并将其设置在Session变量中.当我在另一个页面上访问Session变量时,我注意到如果我在下面的objColors上更改属性,它会更改Session并且不保留原始属性,这是我想要它做的.这是一个例子:
Session["Colors"] = Colors;
Colors objColors = Session["Colors"];
//If I change objColors, it changes the Session. I don't want this to happen.
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法来保留原始属性?为什么这样做?
我想在 asp.net mvc 中缓存一个数据集合并过滤该集合而不更改缓存的集合。
是否有可能做到这一点?
因为现在,当我获取缓存的集合时,我会获得对其的引用,并过滤该集合的数据更改缓存的集合。
有人知道吗?
关注此网站:http://www.csharp411.com/c-object-clone-wars/
我决定手动创建我的课程的深层副本(在网站1.手动克隆之后).我实现了克隆接口和任何必要的属性.我执行了我的程序并检查了我的克隆是否确实与原始实例相同.这是对的.
但是,我的新实例仍然引用了原始实例.因此,我的副本中的任何更改都会反映到原始实例中.
因此,如果这不会创建一个深层副本,那么呢?什么可能出错?
(我想手动进行深度复制以提高我的性能,因此我不想使用ObjectCopier类.(即使它工作得很好,也需要90%的代码运行时间).
代码片段:
类实现:
public class SudokuAlgorithmNorvig: ICloneable
{
Run Code Online (Sandbox Code Playgroud)
克隆方法:
public object Clone()
{
SudokuAlgorithmNorvig sudokuClone = new SudokuAlgorithmNorvig(this.BlockRows, this.BlockColumns);
sudokuClone.IsSucces = this.IsSucces;
if (this.Grid != null) sudokuClone.Grid = (Field[,])this.Grid;
if (this.Peers != null) sudokuClone.Peers = (Hashtable)this.Peers;
if (this.Units != null) sudokuClone.Units = (Hashtable)this.Units;
return sudokuClone;
}
Run Code Online (Sandbox Code Playgroud)
克隆方法调用:
SudokuAlgorithmNorvig sudokuCopy = (SudokuAlgorithmNorvig)sudoku.Clone()
Run Code Online (Sandbox Code Playgroud)
我在所有其他类中都做了同样的事情(实现和设置克隆方法).(Field+ Coordinate)
我有 2 个与 C# 中的类相同的对象。
Myclass obj1 = new Myclass();
Myclass obj2 = null;
obj2 = obj1;
obj1.Name = "abc"; //"abc" will also assign to obj2.Name.
Run Code Online (Sandbox Code Playgroud)
当我分配时obj1.Name="abc",它也会分配给obj2.Name. 我想阻止这一切。我已经尝试过 const, seal 但没有得到结果。有人能建议我如何停止对obj1on的引用obj2吗?
我有一个函数,它从列表中获取一个对象作为参数。我创建了这个对象的一个新实例,并使它等于传递给函数的对象。我更改了新对象的一些属性,但这些更改也会应用于列表中的原始对象。例子:
public void myFunction(Object original)
{
var copyOfObject = original;
copyOfObject.SomeProperty = 'a';
}
Run Code Online (Sandbox Code Playgroud)
从阅读中,我想我正在创建原始对象的浅表副本,因此当我更新新对象的属性时,这会导致原始对象的属性更改为?我见过一些复制整个对象列表以创建深层副本的示例,但我只想创建这个单个对象的深层副本,而不是整个列表。我可以这样做而不必做:
copyOfObject = new Object();
copyOfObject.someProperty = original.someProperty;
Run Code Online (Sandbox Code Playgroud)
在进行更改之前?
我有一个包含多个EventHandler的类(除其他外):
public GameObject
{
public event EventHandler<EventArgs> Initialize;
public event EventHandler<EventArgs> BeginStep;
....
}
Run Code Online (Sandbox Code Playgroud)
我希望能够向Clone()GameObject 添加一个函数,该函数返回它被调用的对象的精确副本.我尝试这样做:
public GameObject Clone()
{
var clone = new GameObject()
{
Initialize = this.Initialize,
BeginStep = this.BeginStep,
};
}
Run Code Online (Sandbox Code Playgroud)
但是,它似乎是clone.BeginStep指向同一个对象,this.BeginStep而不是制作副本.那么,我如何制作一个EventHandler对象的副本呢?
我需要来自另一个位图的位图的深层副本。现在,大部分的解决方案,说像这样,这不是一个深拷贝。这意味着当我锁定原始位图时,副本也会被锁定,因为克隆是原始位图的浅表副本。现在以下似乎对我有用,但我不确定这是否适用于所有情况。
public static Bitmap GetCopyOf(Bitmap originalImage)
{
Rectangle rect = new Rectangle(0, 0, originalImage.Width, originalImage.Height);
Bitmap retrunImage = new Bitmap(originalImage.Width, originalImage.Height, originalImage.PixelFormat);
BitmapData srcData = originalImage.LockBits(rect, ImageLockMode.ReadOnly, originalImage.PixelFormat);
BitmapData destData = retrunImage.LockBits(rect, ImageLockMode.WriteOnly, originalImage.PixelFormat);
int dataLength = Math.Abs(srcData.Stride) * srcData.Height;
byte[] data = new byte[dataLength];
Marshal.Copy(srcData.Scan0, data, 0, data.Length);
Marshal.Copy(data, 0, destData.Scan0, data.Length);
destData.Stride = srcData.Stride;
if (originalImage.Palette.Entries.Length != 0)
retrunImage.Palette = originalImage.Palette;
originalImage.UnlockBits(srcData);
retrunImage.UnlockBits(destData);
return retrunImage;
}
Run Code Online (Sandbox Code Playgroud)
我需要更好,更优雅的方式来做到这一点。否则,只需指出上述代码可能会失败的一些情况。TIA
c# ×10
deep-copy ×3
asp.net ×2
clone ×2
asp.net-mvc ×1
bitmap ×1
caching ×1
collections ×1
reference ×1
silverlight ×1