GetCustomAttributes - PullRequest
       2

GetCustomAttributes

1 голос
/ 13 сентября 2010
    <AttributeUsage(AttributeTargets.Property)> _
Private Class CustomAttrib
    Inherits Attribute

    Public Property DataTypeLength As Integer

End Class

Private Class TestClass
    <CustomAttrib(DataTypeLength:=75)> _
    Public Property MyProp As String
End Class

Dim properties = GetType(TestClass).GetFields(Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)

For each Prop As FieldInfo in Properties

    Dim attributes =    DirectCast(prop.GetCustomAttributes(GetType(TestClass), False), CustomAttrib())

  If Attributes.Any Then
    'get value of custom attribute
  End If
Next

Хорошо, независимо от того, что я делаю, атрибуты всегда равны нулю / ничего.Я также пробовал следующее также:

Attribute.GetCustomAttributes(prop)

Это возвращает два атрибута типа CompilerGeneratedAttribute и DebuggerBrowsableAttribute

Что я здесь делаю неправильно?

Ответы [ 4 ]

3 голосов
/ 13 сентября 2010

Проблема в том, что вы объявили автоматически реализованное свойство, но запрашиваете атрибуты, которые определены в полях. Автоматически реализованное свойство будет иметь поле поддержки, но компилятор не будет копировать пользовательские атрибуты из свойства в поле поддержки. Следовательно, вы ничего не видите.

Способ исправить это - переключить вызов с GetFields на GetProperties. Кроме того, как указал Ганс, вам нужно искать публичные, а не частные объекты и искать пользовательский тип атрибута CustomAttrib, а не класс TestClass

Dim properties = GetType(TestClass).GetProperties(Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public)
2 голосов
/ 13 сентября 2010

Dim properties = GetType (TestClass) .GetFields (...)

Вы пытаетесь получить свойства, но вы использовали GetFields .Вместо этого используйте GetProperties.

Следующая проблема - передаваемые флаги BindingFlags.Вы запрашиваете частные свойства, но у класса есть только общие свойства.Также включите BindingFlags.Public .

Следующая проблема - тип, который вы передаете GetCustomAttributes (), вы хотите искать CustomAttrib, а не тип класса.

Исправлено:

    Dim properties = GetType(TestClass).GetProperties(Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic Or BindingFlags.Public)
    For Each Prop As PropertyInfo In properties
        Dim attributes = DirectCast(Prop.GetCustomAttributes(GetType(CustomAttrib), False), CustomAttrib())
        If attributes.Length > 0 Then
            ''get value of custom attribute
        End If
    Next
0 голосов
/ 13 сентября 2010

Поскольку JaredPar вполне адекватно заявил, это связано с вашими флагами привязки. Это показывает общий урок о Reflection - большинство методов привередливы в том, какие флаги вы используете. Некоторые не интуитивно понятны. Если у вас возникли проблемы, попробуйте поиграть с флагами привязки и попробуйте выбрать все, что, по вашему мнению, относится к типу члена, которого вы ищете.

0 голосов
/ 13 сентября 2010
Dim attributes = DirectCast(prop.GetCustomAttributes(GetType(CustomAttrib), False), CustomAttrib())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...