Пользовательский устаревший атрибут C #

Мне было интересно, можно ли создать собственный устаревший класс. Мне это нужно, и я ненавижу тот факт, что в Obsolete перед вводом появляется это предупреждение: SOMETHING is Obsolete :. Я просто хочу выдать предупреждение / ошибку, когда использую поле / метод ТОЛЬКО с моими данными, например:

[CustomObsolete("Hello")]
public int i = 0;

Выдает предупреждение / отладку Привет.

Это возможно? Если я использую # warning / # error, ВСЕГДА будет отображаться ошибка / предупреждение.


person x_metal_pride_diamond_x    schedule 12.06.2013    source источник


Ответы (3)


Нет, ObsoleteAttribute фактически жестко закодирован в компиляторе C # - нет способа создать собственный атрибут, который компилятор C # будет понимать как указание на то, что член устарел.

Лично я бы просто выбрал ObsoleteAttribute - действительно ли это плохо, что сообщение об ошибке начинается с "X is obsolete"?

person Jon Skeet    schedule 12.06.2013
comment
Мне это не очень нравится, но, похоже, другого выхода нет. - person x_metal_pride_diamond_x; 12.06.2013

Один из способов добиться желаемого - это настроить post-build task. После того, как ваш проект скомпилирован, позвольте другой программе, которую вы создали, загрузить эту сборку и проанализировать ее для вашего атрибута. Затем вы можете вывести сообщение, которое вы хотите, и многое другое. Но вывод точного номера строки и файла, в котором используется этот атрибут, будет сложной задачей, потому что для этого вам нужно будет проанализировать файл pdb (и он будет правильно работать только в режиме отладки).

Вам лучше просто придерживаться атрибута Obsolete .NET. :-)

person JustAnotherUserYouMayKnow    schedule 12.06.2013

можно использовать только устаревшие

С ошибкой

    [Obsolete("Hello", true)]
    public String foo() {
        return "bar";
    }

и с предупреждением

    [Obsolete("Hello", false)]
    public String foo() {
        return "bar";
    }
person VhsPiceros    schedule 12.06.2013
comment
Как я это читал, OP знает об ObsoleteAttribute, но ему не нравится способ сообщения об ошибке - в вашем случае: foo устарело: 'Hello' - person Jon Skeet; 12.06.2013