Ответ 1
Я думаю, что это невозможно, потому что по какой-то причине он был специально запрещен для атрибута Obsolete. Согласно правилам, определенным вокруг целевых объектов атрибута, нет никакой причины, что атрибут Obsolete недействителен для свойства get или set accessor. Чтобы применить атрибут к аксессуру набора свойств, этот атрибут должен быть применим к цели метода, параметра или возвращаемого значения. Если вы посмотрите на атрибут Obsolete, вы увидите, что "метод" является одной из допустимых целей для этого атрибута.
Фактически вы можете определить свой собственный атрибут с теми же действительными целями, что и атрибут Obsolete с атрибутом AttributeUsage, и вы обнаружите, что можете применить его для свойства get или set accessor, тогда как вы не можете применить атрибут Obsolete.
[AttributeUsage(AttributeTargets.Method)]
class MyMethodAttribute : Attribute { }
class MyClass
{
private int _Id;
public int Id
{
get { return _Id; }
[MyMethodAttribute] // this works because "Method" is a valid target for this attribute
[Obsolete] // this does not work, even though "Method" is a valid target for the Obsolete attribute
set { _Id = value; }
}
}
Если вы попытаетесь создать свой собственный атрибут, который недействителен в аксессуре набора свойств, и вы примените его там, вы можете заметить, что сообщение об ошибке несколько отличается. Сообщение об ошибке для вашего настраиваемого атрибута будет "Атрибут" YourCustomAttribute "недействителен для этого типа объявления.", Тогда как сообщение об ошибке для атрибута Obsolete "Attribute" Obsolete "недействительно для аксессуаров свойств или событий". Тот факт, что сообщение об ошибке отличается, заставляет меня поверить, что это правило, которое по какой-либо причине явно встроено в компилятор для атрибута Obsolete, вместо того, чтобы полагаться на атрибут AttributeUsage, который, предположительно, применяется к атрибуту Obsolete.