Lou*_*der 2 .net c# vb.net asp.net
也许这是漫长的一天,但我无法弄清楚这一点.
我从WCF检索一个大的自定义对象,并将其存储在一个应用程序变量中.每20分钟发生一次.
对于每个Web用户,我正在检查此应用程序变量的存在和超时,如果需要,请重新查询我的wcf并构建一个新对象,并将其重新存储在应用程序变量中.
这一切都很好.
现在,我试图"复制"这个"主"对象,修改它,并将其存储在会话变量中,并在整个会话生命周期中根据需要进行修改.(修改会话变量).
每次我修改会话对象时,应用程序变量中的对象都会被修改.
伪
application("mastervar") = object from wcf (obejct type - xcustomclass)
dim mynewobject as new xcustomclass
mynewobject = application("mastervar")
Run Code Online (Sandbox Code Playgroud)
*修改mynewobject,也修改应用程序("mastervar")
我试过了:
session("mynewSessionVar") = application("mastervar")
mynewobject = session("mynewSessionVar")
Run Code Online (Sandbox Code Playgroud)
修改mynewobject,修改应用程序("mastervar")
我试过了:
使用for循环手动将mastervar对象中的所有属性复制到新对象.
mycustomobject = new xcustomclass
mycustomobjectObject as new xcustomclass.object
mymasterobject = application("mastervar")
for each object in mymasterobject.objectslist
mycustomobjectObject = new xcustomclass.object
with mycustomobjectObject
.property = object.property
end with
mycustomobject.objectlist.add(mycustomobjectObject)
next
Run Code Online (Sandbox Code Playgroud)
同样的事情,修改mycustomobject,也修改了应用程序("mastervar")
正如我所说,也许这是一个漫长的一天,但我已经对这个问题多了几个小时......
Private Function copy_fresh_units(unitsFromWcf As WebResortUnits) As WebResortUnits
Dim myFreshUnits As New WebResortUnits
Dim myFreshUnit As WebResortUnits.qbunit
For Each Unit In unitsFromWcf.resortUnits
myFreshUnit = New WebResortUnits.qbunit
With myFreshUnit
' .Availability = Unit.Availability
.mapDetails = Unit.mapDetails
End With
myFreshUnits.resortUnits.Add(Unit)
Next
return myFreshUnits
End Function
Run Code Online (Sandbox Code Playgroud)
修改myfreshUnits中的availability属性,它仍然更新app var.我看过参考和价值类型,这绝对是我的问题.但考虑到这个编辑,我知道我错过了什么,它是什么,我不确定...... :-)
您正在创建对对象的新引用,然后修改您引用的对象并期望您的两个引用不是同一个对象?
听起来你真正想做的就是克隆对象或对对象进行深度复制.
如果这些是自定义对象,您将需要自定义代码来克隆它们.
克隆对象时,请确保创建新对象并从旧对象设置该新对象上的所有值类型.然后浏览并克隆所有引用类型,并在克隆上设置引用属性以指向您创建的属性的克隆.
编辑:解决您的更新
问题仍然是......你复制的所有东西显然都是一种参考类型而且它没有被克隆.因此,当您编辑任一引用时,它只存在一个对象,它会更改对象.
编辑2:序列化将帮助您
在内存中序列化和反序列化基础对象是克隆它的简单方法.我通常编写一个自定义克隆方法来序列化/反序列化对象.这样你就有了一个你总是会调用的Clone()方法,并且你需要的任何自定义代码都无法通过序列化/反序列化来处理,你可以在该方法中处理.