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

时间:2012-01-05 14:53:41

标签: .net

我很确定这是一个重复的问题,但我找不到原文。

我得到了一些我需要“附加”一些信息的对象。基本上,如果该对象回到同一段代码,我需要看到我之前已经看过它。

即。像这样的东西:

Dictionary<WeakReference<ObjectType>, string> _Cache;

注意那里的弱引用(我知道WeakReference不是通用的btw),我需要使缓存的键成为弱引用,以处理对象被GC控制的事实。

现在,我可以让缓存充满弱引用,但我似乎回想起.NET中已经存在的类似类型的系统,它与对象一起自动GC。

请注意,我不记得这样做的开销,所以在确定这是否是一个比我自己的缓存好的/更好的解决方案之前,我会确保阅读这个主题。不幸的是我无法更改有问题的对象,所以我需要在其他地方跟踪这个元信息。

我的局限:

  • 对象不是我的,所以我无法以任何可能的方式改变它
  • 我不能继承对象,因为它是密封的,此外,我对象,我不构造它们,所以我必须能够用一个实例替换一个实例为了这个有用的新的后代类型的对象
  • 对象是GC控制的,所以我不能只使用一个字典,它将慢慢填满,或者通过“引用”到非对象的对象,或者将保留对象,我需要一个字典使用弱引用键(因此:自定义词典)
  • 虽然我可以将它们封装在我自己的代码中并因此携带所需的信息,然后将这些对象传递回我无法控制的框架,然后从同一个框架返回给我,因此我需要能够仅使用相关对象检索/查找旧信息

基本上是这样的:

PropertyAttacher.Attach(instance, "Name", name);

我记得没错吗?涉及的课程是什么?

2 个答案:

答案 0 :(得分:6)

您可能正在寻找.NET 4的ConditionalWeakTable<TKey, TValue>

答案 1 :(得分:3)

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

来自MSDN:

  

RuntimeHelpers.GetHashCode在您关心的场景中非常有用   对象身份。将返回两个具有相同内容的字符串   RuntimeHelpers.GetHashCode的不同值,因为它们是   不同的字符串对象,虽然它们的内容是相同的。

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