相关疑难解决方法(0)

c#copy构造函数生成器

我想将值从一个对象复制到另一个对象.类似于传递值但具有赋值的东西.

例如:

PushPin newValPushPin = oldPushPin; //I want to break the reference here.
Run Code Online (Sandbox Code Playgroud)

有人告诉我为此写一个拷贝构造函数.但是这个类有很多属性,手工编写复制构造函数可能需要一个小时.

  1. 有没有更好的方法通过值将对象分配给另一个对象?
  2. 如果没有,是否有复制构造函数生成器?

注意:Silverlight中不提供ICloneable.

c# silverlight

6
推荐指数
2
解决办法
1942
查看次数

克隆没有序列化的对象

我在SO处找到了许多解决方案,而且是通过序列化/反序列化(进入内存和后退)来处理对象的深层克隆.

它要求克隆的类标记为[Serializable].我碰巧把我的类(大部分都是)标记为[DataContract]因为我使用DataContractSerializer序列化为XML.

我只介绍了[Serializable]属性,因为需要对其中一些类实例进行深度克隆.但是,现在通过DCS进行序列化/反序列化的事情发生了,因为它不再起作用了 - 关于在反序列化时期望不同的XML元素的错误.如果我删除了[Serializable]错误消失了.

我有什么选择?我只想尽可能简单地深入克隆我的对象.

c# clone xml-serialization datacontractserializer

6
推荐指数
1
解决办法
5686
查看次数

将GameObject转换回泛型类型<T>

我正在为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

6
推荐指数
1
解决办法
1250
查看次数

你如何制作一个对象的副本?

我创建了一个名为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)

是否有更好的方法来保留原始属性?为什么这样做?

c# asp.net

5
推荐指数
1
解决办法
3063
查看次数

缓存集合并对其进行过滤,无需修改 ASP.NET 中的原始缓存集合

我想在 asp.net mvc 中缓存一个数据集合并过滤该集合而不更改缓存的集合。

是否有可能做到这一点?

因为现在,当我获取缓存的集合时,我会获得对其的引用,并过滤该集合的数据更改缓存的集合。

有人知道吗?

c# asp.net collections asp.net-mvc caching

5
推荐指数
1
解决办法
5998
查看次数

如何手动创建深层副本

关注此网站: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)

c# clone reference deep-copy

5
推荐指数
1
解决办法
571
查看次数

如何停止引用其他类对象?

我有 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吗?

c#

5
推荐指数
1
解决办法
4625
查看次数

在不参考原件的情况下复制对象

我有一个函数,它从列表中获取一个对象作为参数。我创建了这个对象的一个​​新实例,并使它等于传递给函数的对象。我更改了新对象的一些属性,但这些更改也会应用于列表中的原始对象。例子:

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)

在进行更改之前?

c#

5
推荐指数
1
解决办法
7310
查看次数

C#clone EventHandler

我有一个包含多个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对象的副本呢?

c# event-handling

4
推荐指数
2
解决办法
6972
查看次数

从 C# 中的位图创建一个全新的位图副本

我需要来自另一个位图的位图的深层副本。现在,大部分的解决方案,说像这样,这不是一个深拷贝。这意味着当我锁定原始位图时,副本也会被锁定,因为克隆是原始位图的浅表副本。现在以下似乎对我有用,但我不确定这是否适用于所有情况。

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# bitmap image-processing deep-copy

4
推荐指数
1
解决办法
2773
查看次数