我将数据存储在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"]
中的实际对象。
我做错了什么?
答案 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);