2015-08-03 3 views
1

Как я должен быть a) определять пользовательские атрибуты и b) получать указанное назначение пользовательских атрибутов в следующем сценарии?VB.net (.NET 3.5) Пользовательский атрибут и Type.GetCustomAttribute() всегда 1

Сценарий: мы хотели бы определить пользовательский атрибут (custAtrib1), который будет использоваться унаследованным классом (myClassFoo базового класса (myBase). Затем базовый класс будет извлекать пользовательские атрибуты, назначенные унаследованному экземпляру, а затем выполнить некоторые операции

Проблема:.. Всякий раз, когда GetCustomAttribute называется в базовом классе по отношению к унаследованного класса, метод GetCustomAttibutes возвращает только один результат (System.Runtime.CompilerServices.CompilerGlobalScopeAttribute)

Вот как атрибуты/классы определены:

Атрибут: (файл: myFoo.vb)

'----------------------------------------------------------------- 
Namespace Foo.CustomAttributes 

<System.AttributeUsage(AttributeTargets.Class, AllowMultiple:=True, inherited:=False)> _ 
Public Class custAttrib1 
    Inherits System.Attribute 

    Public Property myAttributeInto as String 
End Namespace 
'----------------------------------------------------------------- 

Базовый класс: (файл: myBar.vb)

'----------------------------------------------------------------- 
Namespace Foo.Bar 
Public Class myBase 

    Private Sub someCoolCode() 
     Dim myInstanceType as Type = me.GetType() 
     Dim custAttribs as Object() = myInstanceType.GetCustomAttributes(False) 

     '-- at this time, only content of custAttribs array is System.Runtime.CompilerServices.CompilerGlobalScopeAttribute) 
    End Sub 

End Class 
End Namespace 
'----------------------------------------------------------------- 

Наследуется Класс: (файл: myBar2.vb)

'----------------------------------------------------------------- 
Namespace Foo.Bar 
<Foo.CustomAttributes.custAttrib1(myAttributeInfo:="Coding if fun")> _ 
Public Class myClassFoo 
     '-- other cool stuff goes there 
    Public Sub inheritedMethod() 
    End Sub 
End Class 
End Namespace 
'----------------------------------------------------------------- 

Спасибо за вашу помощь

+0

ваш базовый класс разве украшен атрибутом, поэтому оно не будет там 'Me'. ваш 'myclassFoo', который имеет атрибут, не наследует от mybase. если вы добавите конструктор в атрибут, вы можете упростить установку значения свойства. – Plutonix

+0

Как и в другом случае, ваше соглашение об именах для вашего атрибута не соответствует лучшим практикам. Подумайте об именовании вашего класса атрибутов следующим образом: 'Public Class CustAttrib1Attribute' Обратите внимание, что слово« Атрибут »в конце рекомендуется. Вы можете оставить это при использовании атрибута. Кроме того, имена классов должны быть капитализированы. –

+0

Спасибо за рекомендации! – MonkeyPen

ответ

0

единственный PROB lem в вашем коде - это то, что вы не наследуете от базового класса. В противном случае он работает правильно.

Вот пример я использовал для тестирования, включая наследование и исправление опечаток:

Public Class Form1 

    Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 

     Dim oClass = New myClassFoo 
     oClass.someCoolCode() 

    End Sub 

End Class 

<System.AttributeUsage(AttributeTargets.Class, AllowMultiple:=True, inherited:=False)> _ 
Public Class custAttrib1 
    Inherits System.Attribute 

    Public Property myAttributeInfo As String 
End Class 

Public Class MyBaseClass 

    Public Sub someCoolCode() 
     Dim myInstanceType As Type = Me.GetType() 
     Dim custAttribs As Object() = myInstanceType.GetCustomAttributes(False) 

     '-- at this time, only content of custAttribs array is System.Runtime.CompilerServices.CompilerGlobalScopeAttribute) 

     Debug.WriteLine(DirectCast(custAttribs(0), custAttrib1).myAttributeInfo) 
    End Sub 

End Class 

<custAttrib1(myAttributeInfo:="Coding is fun")> _ 
Public Class myClassFoo 
    Inherits MyBaseClass 

    '-- other cool stuff goes there 
    Public Sub inheritedMethod() 
    End Sub 
End Class 
+0

Моя другая проблема заключалась в том, что myBaseClass наследовался от System.Web.UI.Page. Я не знал, что тип экземпляра страниц ASP.NET не совпадает с определениями классов в связанном файле * .asp.vb. Вместо этого мне нужно было посмотреть на «BaseType» на странице, например, me.GetType(). BaseType. Как только у меня была ссылка типа на правильный тип, я смог получить список необходимых атрибутов. – MonkeyPen