Генерация дополнительного кода через пользовательский атрибут - PullRequest
4 голосов
/ 20 мая 2011

Я все еще довольно новичок в C #, и у меня есть вопрос относительно атрибутов. Можно ли написать собственный атрибут, который генерирует дополнительный код во время компиляции. Например:

[Forever]
public void MyMethod()
{
    // Code
}

Превращается в:

public void MyMethod()
{
    while (true)
    {
        // Code
    }
}

Ответы [ 2 ]

7 голосов
/ 20 мая 2011

Из коробки нет, это не то, что можно сделать. Используя PostSharp, этого можно достичь:

http://www.sharpcrafters.com/aop.net/compiletime-weaving

3 голосов
/ 20 мая 2011

Afterthought работает аналогично PostSharp, выполняя изменения во время компиляции ваших сборок. В случае с Afterthought вы можете выбрать, как определить изменения, которые нужно внести, либо путем поиска определенных вами атрибутов, поиска общих шаблонов или просто путем создания соглашений.

Например, я работаю над примером использования Afterthought для автоматической реализации интерфейсов Entity Framework во время компиляции для типов, предоставляемых DbContext в скомпилированной сборке. В этом случае я просто ищу любой тип, который является подклассом DbContext, а затем просматриваю свойства этого типа, чтобы определить, какие типы POCO следует изменить для работы с Entity Framework.

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

...