Могут ли атрибуты реализовать интерфейс?

Я использую Unity Container для перехвата и поэтому пытаюсь добавить атрибут [Trace], например.

открытый класс TraceAttribute : HandlerAttribute

а затем в коде я могу использовать его так:

public class MyClass
{
    [Trace]
    public void DoSomething()
    {
        ...
    }
}

Вот мой вопрос/цель: я не хочу, чтобы атрибут Trace был привязан к перехвату Unity. Если позже я изменю контейнеры DI или захочу реализовать свои собственные и т. д., я бы хотел заменить их, как мы это делаем для интерфейсов.

что-то типа:

открытый интерфейс TraceAttribute : ITraceAttribute

а затем есть конкретная реализация? это возможно?

Одна из проблем, с которыми мы сталкиваемся, заключается в том, что везде, где я использую атрибут Trace, у меня должна быть установлена ​​сборка Unity, а я бы хотел этого избежать.

Спасибо!


person Raymond    schedule 14.10.2014    source источник
comment
Я уверен, что это возможно, но, скорее всего, это ничего не даст. Если Unity ищет HandlerAttribute, вы не сможете заставить его искать ITraceAttribute.   -  person BradleyDotNET    schedule 14.10.2014


Ответы (1)


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

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

person dotnetom    schedule 18.10.2014