Представьте, что у меня есть один класс с двумя экземплярами:
MyClass a = new MyClass();
MyClass b = new MyClass();
MyClass имеет метод PrintUniqueInstanceID:
void PrintUniqueInstanceID()
{
Console.Write("Unique ID for the *instance* of this class: {0}",
[what goes here???]
);
}
В идеале выход будет выглядеть примерно так:
Unique ID for the *instance* of this class: 23439434 // from a.PrintUniqueInstanceID
Unique ID for the *instance* of this class: 89654 // from b.PrintUniqueInstanceID
Итак - что бы я вставлял в "[what goes here???]
" выше, который печатает уникальный номер для каждого уникального экземпляра класса?
Идеи
- Возможно, нарисуйте "this" на указатель int и используйте это?
- Использовать GCHandle?
- Доступ к свойству "this", в рамках метода, чтобы однозначно идентифицировать его?
(необязательно) Справочная информация для экспертов
Причина, по которой мне это нужно, это то, что я использую AOP и PostSharp для автоматического обнаружения проблем с потоками. Мне нужно найти каждый уникальный экземпляр класса в словаре, чтобы убедиться, что несколько потоков не обращаются к одному и тому же уникальному экземпляру класса (его нормально, если есть один поток для экземпляра класса).
Обновление
Как отмечали другие, я должен упомянуть, что я не могу тронуть ни один из существующих классов в проекте из 30 000 строк. PrintUniqueInstanceID, выше, является аспектом (см. PostSharp), который добавляется в класс верхнего уровня, наследуется каждым классом во всем проекте и выполняется на каждой записи метода во всем проекте.
Как только я проверил, что все поточно-безопасно, я удалю этот аспект, чтобы восстановить производительность.