从Session []复制对象

时间:2014-12-12 15:37:58

标签: c# asp.net-mvc object

我将数据存储在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"]中的实际对象。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

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

以下是有关如何复制通过引用传递的对象的一般信息。

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

您需要通过在类中实现Copy接口来创建对象的IClonable,或者创建一个方法,该方法将返回一个新对象,其中包含从现有对象复制的字段(这样做不起作用)如果您有嵌套对象,如果是这种情况,则需要进行深层复制:How do you do a deep copy of an object in .NET (C# specifically)?):

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);