Может ли пользовательский атрибут подразумевать другие атрибуты без наследования? - PullRequest
4 голосов
/ 19 августа 2009

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

Немного хлопотно документировать это требование и копировать и вставлять оба этих атрибута в каждый класс, который использует мою библиотеку, поэтому я подумал, что было бы лучше, если бы мой пользовательский атрибут просто подразумевал присутствие другого , Однако этот другой атрибут из .NET Framework запечатан, поэтому я не могу просто наследовать его ...

Так есть ли способ сделать это? Можно ли добавить атрибут .NET во время выполнения?

Спасибо.

Ответы [ 2 ]

1 голос
/ 20 августа 2009

Пока вы можете использовать наследование в атрибутах, рекомендуется не .

Поскольку это только правило производительности, вы не будете нарушать правильность, но оноЭто может привести к путанице, и вы должны приложить немало усилий, чтобы не нарушить семантику базового атрибута.Вы можете вызвать проблемы, если попытаетесь расширить возможные местоположения для атрибута с помощью флагов AttributeUsage.Правила для рассматриваемого атрибута довольно сложные .

В методе может применяться любой из двух атрибутов, но не оба.Любая операция, которая еще не применена, использует атрибут, примененный к содержащему классу.Если содержащий класс не применяет ни один из атрибутов, используется DataContractSerializer.

Дайте этому сделать его запечатанным звучит как разумный план с их стороны.Этот API не предназначен для такого рода расширений.

Нет способа (за исключением «внедрения кода» в стиле AOP) добавлять атрибуты к существующим классам во время выполнения.

1 голос
/ 19 августа 2009

Я не верю, что есть способ подразумевать вторичные атрибуты или добавлять атрибуты во время выполнения. Однако вы можете использовать пользовательский шаблон кода для добавления атрибутов в каждый класс по мере их добавления. И / или для классов, которые уже разработаны, я подозреваю, что вы могли бы написать макрос, который проходит через каждый файл и добавляет атрибуты к классам, однако я не делал этого в прошлом, поэтому я не уверен, что это повлечет за собой Я знаю, что сделать шаблон кода для добавления к атрибутам в объявлении класса относительно просто. Но это работает только для класса, который вы добавляете с момента добавления шаблона. Если вам нужно очистить старые классы, я бы посмотрел макросы, если у вас есть много файлов / классов, для которых это нужно сделать. Или сделайте это вручную, если их не слишком много.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...