Как я должен быть 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
'-----------------------------------------------------------------
Спасибо за вашу помощь
ваш базовый класс разве украшен атрибутом, поэтому оно не будет там 'Me'. ваш 'myclassFoo', который имеет атрибут, не наследует от mybase. если вы добавите конструктор в атрибут, вы можете упростить установку значения свойства. – Plutonix
Как и в другом случае, ваше соглашение об именах для вашего атрибута не соответствует лучшим практикам. Подумайте об именовании вашего класса атрибутов следующим образом: 'Public Class CustAttrib1Attribute' Обратите внимание, что слово« Атрибут »в конце рекомендуется. Вы можете оставить это при использовании атрибута. Кроме того, имена классов должны быть капитализированы. –
Спасибо за рекомендации! – MonkeyPen