Можно ли кодировать пользовательский атрибут, который нарушает сборку (например, System.ObsoleteAttribute)? - PullRequest
4 голосов
/ 17 августа 2011

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

Например, рассмотрим следующий код C # (обратите внимание, что это упрощенный пример):

public class MyClass
{
    [Check]
    public int MyProp { get; private set; }
}

Этот атрибут Check должен проверять, что свойство, которое он декорирует, имеет открытый установщик.Так как свойство MyProp не имеет общедоступного установщика (оно имеет частный установщик), атрибут Check должен нарушать сборку.

Возможно ли это?

1 Ответ

3 голосов
/ 17 августа 2011

Нет - по крайней мере, на данный момент, со стандартными инструментами сборки. Вполне возможно, что когда выйдет проект «Компилятор как сервис», это может раскрыть эту функциональность. Но компилятор C # действительно изменяет свое поведение только несколькими известными атрибутами.

Два варианта, которые вы можете рассмотреть:

  • Постобработка с чем-то вроде PostSharp
  • Юнит-тест, чтобы найти все атрибуты и проверить их таким образом

Лично я бы, вероятно, согласился с последним ... хотя на самом деле не так уж много очевидного преимущества - если вы помните, что декларативно добавляете атрибут [Check], не собираетесь ли вы добавить публичный установщик? Или, говоря иначе: если вы забудете включить публичный сеттер, разве вы не забудете включить атрибут?

...