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
'-----------------------------------------------------------------
Унаследованный класс: (file: 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
'-----------------------------------------------------------------
Спасибо за помощь
1 ответ
Единственная проблема в вашем коде заключается в том, что вы не наследуете от базового класса. В противном случае это работает правильно.
Вот пример, который я использовал для тестирования, включая наследование и исправление опечаток:
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