Есть ли Атрибут для ограничения Типа, к которому может применяться пользовательский Атрибут? - PullRequest
4 голосов
/ 25 февраля 2011

Я пишу атрибут (это ValidatorAttribute), который в настоящее время имеет

[AttributeUsage(AttributeTargets.Property)]

, который ограничивает тип конструкции, в которую можно поместить атрибут.Его можно применить к любому свойству, которое может существовать.

Мне интересно, есть ли атрибут, ограничивающий Type свойства, к которому этот атрибут может быть применен.Я хочу ограничить его использование в DateTime свойствах.

Я вижу несколько вариантов, но они не идеальны:

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

В идеале я получаю ошибку времени компиляции, как если бы я поместил этот атрибут на что-либо, кроме свойства:

Атрибут не являетсядопустимо в этом типе объявления.Он действителен только для объявлений 'property, indexer'.

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

Ответы [ 2 ]

2 голосов
/ 25 февраля 2011

Единственный способ обеспечить это - написать инструмент пост-сборки, который перечисляет все типы в сборке и проверяет, применялись ли ваши типы к правильным.В этом нет особого смысла, атрибут просто не будет иметь никакого эффекта, если он был применен неправильно, вы просто не сможете найти его обратно.

0 голосов
/ 11 июля 2013

Один из инструментов, который может сделать то, что предлагает @Hans Passant, таков: http://www.postsharp.net/ Другой вариант - использовать язык, подобный Boo , .NET-совместимый язык времени выполнения, который поддерживает Абстрактное синтаксическое дерево манипуляции как часть цепочки компиляции .Это позволило бы создать макрос, который будет выполняться во время компиляции и выполнять соответствующую проверку типа.

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