2012-02-19 5 views
1

Я хотел бы автообновить обычные/простые сервисы в контейнере единства. Я думаю, что самый чистый способ сделать это будет через пользовательский атрибут.Пользовательский атрибут атрибута System.Type

Затем я могу изучить все (абстрактные) классы в сборке и зарегистрировать эти типы с единством.

Часть информации я Недостающий интерфейс (ы), что класс хочет быть зарегистрирован против

например:

Public Class AutoRegisterAttribute 
    Public Property ForInterface As System.Type 

    Public Sub New(ForInterface As System.Type) 
     Me.ForInterface = ForInterface 
    End Sub 

    ... 

End Class 

И класс будет использовать его следующим образом

<AutoRegister(ForInterface:=Stratego.Interfaces.IEngine)> 
Public Class StrategoEngine 
    Implements IEngine 
    Implements IDisposable 

    ... 

End Class 

Обратите внимание, я не хочу, чтобы найти какой-либо класс он реализует, как показано с IDisposable

Я попытался сделать это с помощью дженериков (дженерики не может наследовать от Attribute), с типом параметра (Passing в результатах IEngine.GetType в «Constant выражения требуется»)

возможно ли это? Если да, то как я могу это достичь?

ответ

3

Вполне возможно, вы просто должны написать:

<AutoRegister(ForInterface := GetType(Stratego.Interfaces.IEngine))> 
+0

Спасибо, thaqt именно то, что я был после – Basic

0

Я не совсем понимаю, чего вы пытаетесь достичь, но я думаю, что в соответствии с вашим примером кода вы могли бы просто поместить пустой атрибут (что-то вроде <AutoRegister>) и использовать его для поиска всех классов, которые вы хотите зарегистрировать , Тип интерфейса уже реализован зарегистрированным классом, поэтому вы можете просто извлечь его из типа во время выполнения.

+0

Проблемы с этим состоит в том, что я не necesarily хочу зарегистрировать его на все интерфейсы он реализует. – Basic

Смежные вопросы