Пользовательский атрибут только для определенных классов - PullRequest
1 голос
/ 09 февраля 2010

Я хотел бы определить ограничение для моего пользовательского (PostSharp) атрибута. Моя цель - получить сообщение об ошибке или предупреждение во время компиляции, если класс X не реализует интерфейс Y , но у него есть мой атрибут.

Так что это должно работать:

[MyAttributeOnlyForY]
public class X : Y { ... }

но это должно нарушить процесс компиляции:

[MyAttributeOnlyForY]
public class X { ... }

Как это возможно?

Причина

Этот атрибут работает как аспект (это атрибут PostSharp ), и я хочу быть уверенным, что сплетенный класс предоставляет всю необходимую информацию для этого атрибута.

Я хочу избежать null результат на

(eventArgs.Instance as ILoggerServiceOwner)

и я думаю, что проверка времени - это хорошая практика.

Решение

Я нашел идеальное начало здесь: Проверка использования атрибутов с помощью PostSharp Аспекты

Ответы [ 2 ]

1 голос
/ 10 февраля 2010

Вы можете использовать метод PostSharp CompileTimeValidate и использовать отражение, чтобы проверить, имеет ли тип производный тип. Тем не менее, это может быть вычислительно дорого, ищите все типы в сборке.

1 голос
/ 10 февраля 2010

Я думаю, что это невозможно. Лучшим решением может быть использование атрибута «Устаревший» в конструкторе пользовательских атрибутов для предупреждения, что целевой класс должен реализовывать интерфейс Y.

...