Должно ли это действительно возвращать пустую строку ()? - PullRequest
1 голос
/ 26 ноября 2010

У меня есть класс атрибута:

<AttributeUsage(AttributeTargets.Property)> _
Public Class DirectoryAttribute
    Inherits Attribute

    Private _attribute As String

    Public Sub New(ByVal attribute As String)
        _attribute = attribute
    End Sub

    Public ReadOnly Property Attribute As String
        Get
            Return _attribute
        End Get
    End Property
End Class

И интерфейсы и классы:

Public Interface IDirentoryEntity
    <DirectoryAttribute("Name")> _
    Property Name As String
End Interface

Public Interface IOrganizationalUnit
    Inherits IDirectoryEntity
End Interface

Public Class OrganizationalUnit
    Implements IOrganizationalUnit

    ' Implementing IOrganizationalUnit here...'
End Class

Public Interface IIdentifiableDirectoryEntity
    Inherits IDirectoryEntity

    <DirectoryAttribute("sAMAccountName")> _
    Property Login As String
End Interface

Public Interface IGroup
    Inherits IIdentifiableDirectoryEntity
End Interface

Public Class Group
    Implements IGroup

    Private _attributes() As String

    ' Implementing IGroup here...'

    Private ReadOnly Property Attributes() As String()
        Get
            If (_attributes Is Nothing) Then
                Dim attr() As DirectoryAttribute = _
                    CType(GetType(Group).GetCustomAttributes(GetType(DirectoryAttribute), True), DirectoryAttribute())

                If (attr Is Nothing OrElse attr.Length = 0 OrElse attr(0) Is Nothing) Then _
                    Return New String(0) { }

                _attributes = New String(attr.Length) { }

                For index As Integer = 0 To attr.Length - 1 Or _attributes.Length - 1 Step 1
                    _attributes(index) = attr(index).Attribute
                Next
            End If

           Return _attributes
        End Get
    End Property
End Class

С учетом сказанного, Private Property Attributes() As String() не должен возвращать значения DirectoryAttribute, помещенныетакже через свойства интерфейсов, поскольку я указываю True в параметре наследования метода Type.GetCustomAttributes?

1 Ответ

2 голосов
/ 23 июня 2011

Я думаю, что есть две основные путаницы:

  1. Ваш код ищет атрибуты типа, и атрибуты применяются к свойствам.Если вы хотите получить атрибут, вам нужно найти его в свойстве, таком как Логин или Имя.
  2. В любом случае, существует разница между наследованием и реализацией.Класс Group реализует интерфейс IGroup, поэтому вы не увидите никаких атрибутов, определенных в IGroup, при запросе унаследованных атрибутов для Group.Если вам нужны атрибуты интерфейса, который реализует тип, вам нужно спросить об интерфейсе напрямую, вы не можете пройти через тип.
...