如何将实例数据 into/over 复制到现有的 class 引用? C#

How to copy instance data into/over an existing class reference? C#

上下文:我正在尝试编写 resource/content 管理器。加载内容时,将分配描述资源并保存非托管数据的 class 并将其传递回调用方。我想为这个管理器提供的一个功能是能够在程序运行期间重新加载资产。然而,此时,对该资源的引用可能已在程序的各个部分共享,据我所知,创建新资源并分配旧引用只会将该特定变量的引用更改为新资源,并且其他不变。

因此我的问题是:如何创建class的新实例,并复制到先前资源所在的内存块中?或者,我认为这里真正的问题是:我如何解决无法做到这一点的问题? (我假设由于指针的任意性,拥有不同的数据,尤其是不同大小的数据无论如何都行不通,但我不知道,也无法在其他地方找到答案。)

猜测(随意跳过):我对第二个问题的解决方案的第一个猜测是使用标识符传递对内容管理器本身的引用,但这似乎很笨拙,必须传递多个引用一个人的地方。另一种解决方案是在重新加载时触发事件系统,但是让每个使用这些资源的 class 都必须管理此事件似乎也是一个坏主意。

如果有人需要更多上下文,请留言,谢谢。

如果您可以获得指向非托管内存的指针,则完全有可能用其他内容覆盖它,请参阅 copy intptr 了解有关如何操作的一些信息。如果内存已被复制到其他地方,或者新数据与旧数据的大小不同,这将不起作用。

您可以对值类型的托管数组执行类似的操作,但我认为您无法获得指向引用类型对象的指针。所以你不能就地替换参考对象。但是,如果需要,您可以使用反射来更改对象中的字段,但通常不建议这样做。

解决此类问题的一种方法是使用间接寻址。与其共享对象,不如共享一个允许替换对象的包装器。也可以向此包装器添加一个事件,该事件在替换对象时引发。使用此系统,各种组件可能需要监视资源的更改并进行适当处理。

如果这是一款游戏,我会考虑只重新启动整个图形系统并重新加载所有资源,这可能比确保所有组件正确处理重新加载更容易。