2

也许这是漫长的一天,但我就是想不通。

我从 WCF 检索一个大型自定义对象,并将其存储在应用程序变量中。这种情况每 20 分钟发生一次。

对于每个 Web 用户,我正在检查此应用程序变量的存在和超时,如果需要,重新查询我的 wcf 并构建一个新对象,并将其重新存储在应用程序变量中。

这一切都很好。

现在,我正在尝试“复制”这个“主”对象,对其进行修改,并将其存储在会话变量中,并在整个会话生命周期中根据需要对其进行修改。(修改会话变量)。

每次我修改会话对象时,应用程序变量中的对象都会被修改。

application("mastervar") = object from wcf (obejct type - xcustomclass)

dim mynewobject as new xcustomclass
mynewobject = application("mastervar")

*修改 mynewobject,同时修改 application("mastervar")

我努力了:

session("mynewSessionVar") = application("mastervar")
mynewobject = session("mynewSessionVar")

修改 mynewobject,修改 application("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

同样的事情,修改 mycustomobject,也修改 application("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

修改 myfreshUnits 中的可用性属性,它仍然会更新 app var。我已经查看了引用和值类型,这绝对是我的问题。但是考虑到这个 alst 编辑,我知道我遗漏了一些东西,它是什么,我不确定...... :-)

4

2 回答 2

5

您正在创建对对象的新引用,然后修改您引用的对象并期望您的两个引用不是同一个对象?

听起来您真正想做的是克隆对象或对对象进行深度复制。

如果这些是自定义对象,您将需要自定义代码来克隆它们。

当您克隆您的对象时,请确保您创建一个新对象并从旧对象设置该新对象上的所有值类型。然后检查并克隆所有引用类型,并将克隆上的引用属性设置为指向您创建的属性的克隆。

编辑:解决您的更新

问题仍然是……您要复制的所有内容显然都是引用类型,并且没有被克隆。因此,只有一个对象存在,因此当您编辑任一引用时,它会更改对象。

编辑2:序列化会帮助你

在内存中序列化和反序列化基础对象是克隆它的一种简单方法。我通常编写一个自定义克隆方法来序列化/反序列化对象。这样,您就有了一个始终调用的 Clone() 方法,以及您需要的任何无法通过序列化/反序列化正确处理的自定义代码,您可以在该方法中处理。

于 2013-07-23T16:07:08.323 回答
1

我的猜测是,您要复制的属性本身并不都是原语(int, float,string等)。然后,当您更改新对象上的相应属性时,它就会更改原始属性(因为它不是原始属性,实际上是对象引用)。

查看https://github.com/JesseBuesking/BB.DeepCopy,这可能有点矫枉过正,但是如果您阅读了该解决的问题下的内容,您可以看到在这种情况下提供帮助的替代方法。

于 2013-07-23T16:14:39.240 回答