Сведения о вопросе

Junior

18:37, 19th August, 2020

Теги

.net   attributes    

Создайте атрибут для разрыва сборки

Просмотров: 406   Ответов: 11

Хорошо, это следует из моего предыдущего вопроса .

То, что я действительно хотел бы сделать, - это создать какой-то атрибут, который позволяет мне украсить метод, который сломает сборку . Очень похоже на устаревший атрибут("reason", true) , но без ложной идентификации устаревшего кода.

Чтобы уточнить: я не хочу, чтобы он нарушал сборку при любом нажатии F6 (Build), я только хочу, чтобы он нарушал сборку, если метод, украшенный атрибутом, вызывается где-то еще в коде. Как я уже сказал, Похоже на устаревшее, но не то же самое.

Я знаю, что я не одинок в этом, так как другие пользователи хотят использовать его по другим причинам . Я никогда не создавал пользовательские атрибуты раньше, так что все это ново для меня!



  Сведения об ответе

SEEYOU

09:36, 19th August, 2020

Я думаю, что это был бы отличный запрос функции для Microsoft: создайте абстрактный атрибут базового класса CompilerExecutedAttribute , который компилятор обрабатывает тем или иным образом или который может влиять на процесс компиляции. Тогда мы могли бы наследовать от этого атрибута и реализовывать различные операции, например, выдавать ошибку или предупреждение.


  Сведения об ответе

PIRLO

09:11, 10th August, 2020

Если это относится к сериализации XML и NHibernate, где вы хотите, чтобы конструктор без параметров был доступен (как в приведенном примере ), то используйте закрытый или защищенный конструктор без параметров для сериализации или защищенный конструктор для NHibernate. С защищенной версией вы открываете себя для унаследованных классов, способных вызывать этот код.

Если вы не хотите, чтобы код вызывал метод, не делайте его доступным.

EDIT: возможно, чтобы ответить на более глубокий вопрос, AFAIK компилятор знает только о трех атрибутах: устаревшем, условном и AttributeUsage . Чтобы добавить специальную обработку для других атрибутов, потребуется изменить компилятор.


  Сведения об ответе

VERSUION

15:28, 11th August, 2020

Если вы рассматриваете предупреждение (которое является тем, что выбрасывает [устаревший]), то просто используйте директиву компилятора #warning .

Edit: я никогда не использовал его, но #error также доступен.


  Сведения об ответе

#hash

10:21, 4th August, 2020

Я думаю, что единственный способ защиты от дурака-это расширить Visual Studio (через VSIP) и подписаться на правильное событие (возможно, в классе EnvDTE.BuildEvents), а также проверить свой код на использование конструктора и отменить сборку, если вы ее обнаружите.


  Сведения об ответе

ЯЯ__4

09:05, 14th August, 2020

Все это начинает немного напоминать вчерашний TDWTF . :-)


  Сведения об ответе

lool

16:25, 20th August, 2020

Мне придется согласиться с Грегом: составьте для него атрибут.

И если вы действительно серьезны, может быть, найдете способ выяснить, обращается ли к конструктору кто-то другой, кроме XMLSerializer, и создать исключение, если это так.


  Сведения об ответе

FAriza

13:33, 8th August, 2020

Я бы посоветовал вам использовать директиву #error.

Еще одним довольно неизвестным атрибутом, который может выполнять эту работу, является условный атрибут (в зависимости от того, что вы пытаетесь получить)

[Conditional("CONDITION")] 
public static void MiMethod(int a, string msg)

который удалит вызов метода из самого кода IL, если определен "MY_CONDITION".


  Сведения об ответе

PROGA

13:27, 14th August, 2020

Создайте правило FxCop и добавьте FxCop в свою сборку интеграции, чтобы проверить это.

Вы получите предупреждения, а не неудачную сборку. Атрибуты 'run' во время отражения, а не во время сборки.

В качестве альтернативы (и это довольно неприятно) поместите директиву компилятора вокруг метода, который вы не хотите вызывать. Тогда ваш код сломается, если вы вызовете его, но вы можете настроить сборку, которая передает правильную директиву компилятора и не делает этого.


  Сведения об ответе

+-*/

20:41, 9th August, 2020

Ответ 4 года спустя :)

У меня был тот же вопрос, если бы была альтернатива устаревшим.

Из того, что я помню (видео channel9) некоторое время назад Microsoft заявила, что она работает над предоставлением разработчикам доступа к чему-то вроде компилятора api в какой-то момент, поэтому в будущем возможно, что вы могли бы написать компилятор "plugin", который позволил бы украсить методы вашим собственным пользовательским атрибутом и сказать компилятору отменить, если он выглядит так, что украшенный код может быть вызван где-то еще в коде и т. д.

Что на самом деле было бы довольно круто, когда вы думаете об этом. Это также напоминает мне, что я должен также попытаться прочитать о прогрессе этого компилятора api, над которым работает MS...


  Сведения об ответе

SKY

19:17, 21st August, 2020

Создайте пользовательское исключение и модульный тест для него в качестве шага после сборки


  Сведения об ответе

ASSembler

21:06, 1st October, 2020

Почему бы просто не придумать что-нибудь? Неизвестный атрибут наверняка нарушит построение.

[MyMadeUpAttributeThatBreaksTheBuildForSure]
public class NotDoneYet {}


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться