从会话 [] 复制对象

本文关键字:复制 对象 会话 | 更新日期: 2023-09-27 18:34:03

我将数据存储在Session["miData"]中,我想返回此对象,但删除对象内列表中的某些项目。

这是我的代码:

else
{
    ListDevicesByLabelModel data = (ListDevicesByLabelModel)Session["miData"];
    ListDevicesByLabelModel tempdata = data;
    if (filterType == "model" && filterKey != null)
    {
        tempdata.devices.device = data.devices.device.Where(c => c.model == filterKey).ToList();
    }
    return Json(tempdata, JsonRequestBehavior.AllowGet);
}

但是,Session["miData"]中的实际对象由此代码更改。

我做错了什么?

从会话 [] 复制对象

当您从Session获取对象时,您无需担心对象被修改,因为当您从Session获取对象时,已经为您创建了一个副本。所以你的代码实际上是多余的。

下面是有关如何复制通过引用传递的对象的一些常规信息。

对象

通过引用分配,引用指向同一对象。因此,当您将一个变量分配给另一个变量时,它不会复制对象本身。

您需要通过在类中实现IClonable接口或创建一个方法来Copy对象,该方法将返回一个新对象,其中包含从现有对象复制的字段,如下所示(如果您有嵌套对象,这将不起作用,如果是这种情况,您需要执行深度复制: 如何在 .NET 中执行对象的深层复制(特别是 C#)?:

public class  ListDevicesByLabelModel
{ 
     public ListDevicesByLabelModel Clone()
     {
          var newObj = new ListDevicesByLabelModel();
          newObj.SomeProperty = SomeProperty;
          //assign other properites
          return newObj;
     }
}

并稍后使用它:

ListDevicesByLabelModel data = (ListDevicesByLabelModel)Session["miData"];
ListDevicesByLabelModel tempdata = data.Clone();
if (filterType == "model" && filterKey != null)
{
     tempdata.devices.device = data.devices.device.Where(c => c.model == filterKey).ToList();
}
return Json(tempdata, JsonRequestBehavior.AllowGet);