在.NET中将元信息附加到对象上

10

我相信这是一个重复的问题,但我找不到原来的问题。

我正在获取一些对象,需要给它们“附加”一些信息。基本上,如果那个对象再次返回到同一段代码中,我需要看到我以前已经见过它。

例如,像这样:

Dictionary<WeakReference<ObjectType>, string> _Cache;
注意其中的弱引用(我知道 WeakReference 并不是泛型),我需要将缓存的键作为弱引用来处理,以处理对象在我的控制范围之外被 GC 回收的情况。
现在,我可以让这个缓存充满弱引用,但我似乎记得 .NET 中已经存在类似的系统,该系统会自动随对象一起进行垃圾回收。
请注意,我不记得这样做的开销,因此在决定是否比我自己的缓存更好之前,我会确保阅读相关主题。不幸的是,我无法更改要处理的对象,因此需要在其他地方跟踪这些元信息。
我的限制:
- 对象不归我所有,因此我无法以任何方式更改它。 - 我不能从该对象继承,因为它是密封的,而且我只是收到了这些对象,而不是构造它们,因此我必须能够替换实例为一个后代类型的新对象,以便这种方法有用。 - 对象是在我控制之外被垃圾回收的,因此我不能仅使用字典,因为它会慢慢填满,或者将持有那些不存在的对象的“引用”,或者保留这些对象,我需要一个带有弱引用键的字典(因此是自定义字典)。 - 尽管我可以将对象封装到自己的代码中并携带所需的信息,但它会被传回到我无法控制的框架,并从框架中返回给我,因此我需要能够仅通过相关对象检索/查找旧的信息。
基本上,就像这样:
PropertyAttacher.Attach(instance, "Name", name);

我还记得吗?涉及了哪些类?


那个问题在这里不相关,虽然问题看起来相似,但是这里接受的答案提到使用属性或更改类型(或从中派生),这两种方法我都无法实现。 - Lasse V. Karlsen
4
条件弱引用表 ConditionalWeakTable<TKey, TValue>(http://msdn.microsoft.com/en-us/library/dd287757.aspx)是什么? - Simon Mourier
@Simon 谢谢,那正是我在寻找的。如果您将其作为答案留下,我会接受它。 - Lasse V. Karlsen
虽然这个类型是为.NET 4.0而设计的,而我需要一个适用于3.5的东西,但这正是我记得的,所以答案完全正确。 - Lasse V. Karlsen
2个回答

6

没错,就是这个,不过它是为.NET 4.0版本设计的,而我需要一个适用于3.5版本的。这正是我记得的东西。 - Lasse V. Karlsen

3

也许您可以建立一个由RuntimeHelpers.GetHashCode索引的字典。

来自MSDN:

在您关心对象标识的情况下,RuntimeHelpers.GetHashCode非常有用。两个具有相同内容的字符串将返回不同的RuntimeHelpers.GetHashCode值,因为它们是不同的字符串对象,尽管它们的内容相同。

编辑: @Simon Mourier的解决方案似乎更好。


我考虑过这个问题,但这意味着我要在哈希码旁边存储对象的弱引用,以便检测对象是否已被回收,否则我就冒着字典无限增长的风险。目前我会让这个问题暂时搁置,因为我们计划在不久的将来升级到.NET 4.0。 - Lasse V. Karlsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接