Afterthought работает аналогично PostSharp, выполняя изменения во время компиляции ваших сборок. В случае с Afterthought вы можете выбрать, как определить изменения, которые нужно внести, либо путем поиска определенных вами атрибутов, поиска общих шаблонов или просто путем создания соглашений.
Например, я работаю над примером использования Afterthought для автоматической реализации интерфейсов Entity Framework во время компиляции для типов, предоставляемых DbContext в скомпилированной сборке. В этом случае я просто ищу любой тип, который является подклассом DbContext, а затем просматриваю свойства этого типа, чтобы определить, какие типы POCO следует изменить для работы с Entity Framework.
Однако манипулирование подобными сборками во время компиляции, хотя и мощное, все же остается для меня выбором последней инстанции. Он изначально не поддерживается платформой .NET и инструментами Microsoft. Хотя я написал Afterthought для поддержки сложных случаев, когда требовался такой уровень косвенности, я предпочитаю использовать как можно больше стандартных объектно-ориентированных шаблонов и встроенных функций языка C #, таких как делегаты. В конечном счете, введение пользовательских атрибутов, которые внедряют код, вводит в ваше решение предметно-ориентированный язык, который будет тем или иным предметом для изучения / понимания кем-то, кто просматривает ваш код, как, например, при ответе на вопрос SO; -)