1

当我将自定义类的实例放入 Session 中然后将其拉出时,我需要它作为 Session 中的内容的副本出现,而不是对 Session 中的内容的引用。这就是我所拥有的,出于示例目的而淡化了。

protected void btnSubmit_Click(object sender, EventArgs e)
{
    Company selectedCompany = new Company("1234"); //a company code
    selectedCompany.AnotherClass.Value1 = "hello";
    Session["OLD.Company"] = selectedCompany;

    Company newCompany = (Company)Session["OLD.Company"]; //I want this to be a COPY of what's in Session, not a reference to it.
    newCompany.AnotherClass.Value1 = "goodbye";
    Session["NEW.Company"] = newCompany;
}

我逐步查看了 Session 变量,上面的代码导致 OLD.Company 和 NEW.Company 的 AnotherClass.Value1 被设置为“再见”。

最初的 Google 搜索将我指向在我的 Company 类上实现 IClonable 的方向。我尝试了以下方法,但无济于事:

public class Company : ICloneable
{
    //properties...
    //constructors...
    public object Clone()
    {
        return this.MemberwiseClone();
    }
}

进而...

protected void btnSubmit_Click(object sender, EventArgs e)
{
    Company oldCompany = (Company)Session["OLD.Company"];
    Company newCompany = (Company)oldCompany.Clone();
    newCompany.AnotherClass.Value1 = "goodbye";
    Session["NEW.Company"] = newCompany;
}

仍然导致 OLD.Company 和 NEW.Company 的 Value1 都是“再见”。现在我怀疑这是因为 MemberwiseClone() 创建了一个“浅”副本,而我的问题是 Value1 是一个属性中的一个值,它是一个引用类型(AnotherClass)。

但同时,我也发现这个网站说不要实现 ICloneable。因此,出于我的目的,我不确定该做什么/追求什么建议。

我发现的其他几个网站显示了一些版本:

public static object CloneObject(object obj)
{
    using (MemoryStream memStream = new MemoryStream())
    {
        BinaryFormatter binaryFormatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
        binaryFormatter.Serialize(memStream, obj);
        memStream.Seek(0, SeekOrigin.Begin);
        return binaryFormatter.Deserialize(memStream);
    }
}

这要求我让我的类可序列化 --- 这可能没问题(我必须阅读序列化),但是在阅读了关于不使用 ICloneable 的文章后,我不确定我是否应该花时间去追求一个ICloneable 解决方案。

4

1 回答 1

3

您的问题与 Session 对象无关。您只需要制作一个对象的副本,对吗?

以下是编写复制构造函数的方法:

http://msdn.microsoft.com/en-US/library/ms173116%28v=VS.80%29.aspx

class Company 
{
...
  public Company (Company other)
  { 
    // copy fields here....
  }
}
于 2012-11-20T02:09:38.130 回答