Нет ничего встроенного, что позволяет вам перехватывать объект, экземпляром которого вы не можете управлять. Точно так же не будет новых возможностей для этого в предстоящем .net 4.0.
Если вы можете управлять созданием экземпляра:
- Если ваш объект может быть MarshalByRef, вы можете использовать RealProxy .
- Вы можете использовать довольно много контейнеров IOC, например. LinFu , Castle Dynamic Proxy
- Вы можете использовать такой инструмент, как PostSharp , Mono Cecil или Microsoft CCI , чтобы переписать ваши сборки с перехватами в качестве шага после компиляции.
Если вы не можете управлять созданием экземпляра
- Вы можете использовать ICorDebug - API отладки .Net, которые действительно сложны в использовании и тяжелы.
- Вы можете использовать ICorProfiler - API профилирования .Net, которые также довольно сложны в использовании.
В качестве альтернативы, вы можете взглянуть на динамический язык, такой как IronRuby, который имеет встроенную alias_method
и define_method
доброту (которая позволяет вам переопределить все что угодно), так что перехват запекается.
.NET 4.5 представляет метод для ReJIT методов, который предоставляет еще один хук для перехвата метода (при условии, что вы не запускаете параллельный / bg GC и метод не встроен)