是否可以将 ConditionalWeakTable 与元组键(或由多个引用组成的键)一起使用?

Is it Possible to Use ConditionalWeakTable with a Tuple Key (or a key comprised of multiple references)?

我是 ConditionalWeakTable 的忠实粉丝。真的很不错。它本质上允许您 associate/attach/pair 一个引用到另一个引用,同时是线程安全的。

它为我解答了很多 questions/problems。不幸的是,我似乎有一个问题,我继续 运行 进入,但未能找到好的答案。

假设我有一个方法(由下面的测试方法表示),我在其中使用 ConditionalWeakTable,但我没有对密钥使用单个引用,而是需要组合两个项目并制作那把钥匙。这在下面通过 Key 对象显示(出于演示目的和简洁性,它只是扩展的 Tuple):

[Fact]
public void TupleKey()
{
    var first = new object();
    var table = new ConditionalWeakTable<Key, object>();
    var context = table.GetValue( new Key( first, new object() ), key => new object() );

    // .. table has one entry here.

    GC.Collect();
    GC.WaitForPendingFinalizers();

    Debugger.Break(); // Table is empty here.

}

class Key : Tuple<object, object>
{
    public Key( object item1, object item2 ) : base( item1, item2 ) {}
}

调用 Debugger.Break 时,ConditionalWeakTable 为空,即使在测试方法中存在对 Key 的其中一个部分的活动引用。这是有道理的,因为在测试中找不到对 Key 的引用。

但是,由于对 Key 对象的其中一个部分有一个活动引用,我希望 ConditionalWeakTable 中的条目也保持活动状态,并保持活动状态直到所有它的 children/inner 参考文献已被声明。

(在考虑这个和可能的解决方案时,如果有一个 WeakHashSet 可以以某种方式用作 Dictionary<>,但从某些搜索来看,.NET 中似乎不存在 WeakHashSet。)

希望这概述了我的困境。我基本上想使用 ConditionalWeakTable (或某种等效物)来存储关联的值(作为 key/value 条目),而不是使用一个(弱)引用作为条目的键,我想使用两个(或更多)。

我希望实现的目标是否可行(也就是说,无需编写大量自定义代码)?

这个问题与this question有关,我终于找到了解决这个问题的答案,那个问题也很好。您可以阅读答案了解更多详情。

关于这个问题。归结为更多 refined/clever/intelligent 使用 "key" 来使用 ConditionalWeakTable。就我而言,我正在努力处理密钥的三个部分(实例、方法和参数)。我设法通过使用 Delegate(它基本上是实例和方法的引用元组)将前两个组合起来,然后将其与使用 StructuralEqualityComparerDictionary<object[], object> 配对。哇哦。问题已解决。