Прикрепление метаинформации к объекту в .NET.

Я уверен, что это дублированный вопрос, но я не могу найти оригинал.

Я получаю некоторые объекты, которые мне нужно "прикрепить" некоторую информацию. В принципе, если этот объект когда-либо возвращается к одному и тому же фрагменту кода, мне нужно увидеть, что я видел его раньше.

т. что-то вроде этого:

Dictionary<WeakReference<ObjectType>, string> _Cache;

Обратите внимание на слабую ссылку там (я знаю, что WeakReference не является общим битом), мне нужно сделать ключ кеша слабой ссылкой, чтобы справиться с тем, что объекты GC'ed из моего контроля.

Теперь я могу сделать этот кеш полным слабых ссылок, но я, похоже, вспоминаю аналогичный тип системы, уже существующий в .NET, который был GC'ed автоматически рядом с объектом.

Обратите внимание, что я не помню накладных расходов на это, поэтому я обязательно прочитаю эту тему, прежде чем решать, является ли это хорошим/лучшим решением, чем мой собственный кеш. К сожалению, я не могу изменить объект, о котором идет речь, поэтому мне нужно отслеживать эту метаинформацию где-то еще.

Мои ограничения:

  • Объект не мой, поэтому я не могу его каким-либо образом изменить
  • Я не могу наследовать от объекта, поскольку он запечатан, кроме того, мне предоставлены объекты, я их не создаю, поэтому я должен был бы заменить экземпляр новым объектом типа потомка для это полезно
  • Объекты GC'ed из моего контроля, поэтому я не могу просто использовать словарь, который будет медленно заполняться либо "ссылками" на несуществующие объекты, либо будет храниться на объектах, мне нужен словарь со слабым ссылочным ключом (таким образом: пользовательский словарь)
  • Объекты, хотя я мог инкапсулировать их в свой собственный код и, таким образом, переносить вместе с ним требуемую информацию, передается обратно в структуру из моего контроля и возвращается мне из того же самого, и поэтому мне нужно быть способный извлекать/искать старую информацию только с объектом, о котором идет речь.

В принципе, что-то вроде:

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

Я правильно помню? Каковы классы?

Ответ 2

Возможно, вы можете создать dictionnary, индексированный RuntimeHelpers.GetHashCode.

От MSDN:

RuntimeHelpers.GetHashCode полезен в сценариях, где вас волнует идентичность объекта. Вернутся две строки с одинаковым содержимым разные значения для RuntimeHelpers.GetHashCode, потому что они разные строковые объекты, хотя их содержимое одинаковое.

EDIT: Решение @Simon Mourier кажется намного лучше.