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
Другие вопросы по тегам