2009-12-21 1 views
2

Я новичок в пользовательских атрибутах, поэтому мне интересно, можно ли получить значения атрибутов. Пример свойств в моем классе, который я использую пользовательские атрибуты это:VB.net Значения пользовательских атрибутов

Private mFiller As String 
<Position(378), Length(34), DataType("A"), ParticipantDependant("P/D"), RequiredProperty("Required"), Format("Blank")> _ 
Public Property Filler() As String 
    Get 
     Return mFiller 
    End Get 
    Set(ByVal value As String) 
     mFiller = value 
    End Set 
End Property 

Я пытаюсь получить значения этих атрибутов (т.е. получить позицию = 378, длина = 34 и т.д.). , Петля я начинал с выглядит следующим образом:

Dim gwlImport As New ClientGWLImport 
Dim properties() As PropertyInfo = gwlImport.GetType.GetProperties 
Dim tmpInfo As PropertyInfo 
For Each tmpInfo In properties 
    Debug.Print("Attributes for : " & tmpInfo.Name) 
    For Each tmpAttribute As Object In tmpInfo.GetCustomAttributes(True) 
     Debug.Print(tmpAttribute.ToString) 
    Next tmpAttribute 
Next tmpInfo 

Это заставляет меня имена всех атрибутов, но я не уверен, как получить значение. Есть идеи?

Приветствия,

Ryan

ответ

4

Вам нужно будет знать тип атрибута.

Например:

Dim posAtt As PositionAttribute 
posAtt = CType(tmpInfo.GetCustomAttributes(GetType(PositionAttribute), True)(0), PositionAttribute) 
'Use some property of posAtt 

Кстати, вам не нужно создавать новый ClientGWLImport, чтобы получить его Type объект.
Вместо этого, вы можете написать

Dim properties() As PropertyInfo = GetType(ClientGWLImport).GetProperties() 
+0

posAtt = tmpInfo.GetCustomAttributes (GetType (PositionAttribute), True) (0) As PositionAttribute ???? Новый синтаксис? – Codezy

+0

Помимо ошибки синтаксиса, это именно то, что я ищу. Он должен читать: posAtt = CType (tmpInfo.GetCustomAttributes (GetType (PositionAttribute), True) (0), PositionAttribute) – bornbnid

+0

Извините за синтаксическую ошибку; Я слишком привык к C#. – SLaks

0

System.Reflection.CustomAttributeData класса предоставляет функциональные возможности для получения полного определения пользовательских атрибутов декорирования типа или члена.

+0

Это должно использоваться только для кода, который был загружен в контексте только для отражения. Для нормального кода вы должны использовать 'GetCustomAttributes', который, вероятно, будет быстрее и, конечно, будет проще. См. Мой ответ. – SLaks

+0

@SLaks: Несмотря на то, что класс CustomAttributeData, возможно, изначально был предназначен для поддержки того, что иначе не работало бы в контексте только для отражения, оно отлично подходит для нормально загруженной сборки. Это явно указано в документации: «CustomAttributeData может использоваться в контексте выполнения, а также в контексте только для отражения». Если тип атрибута хорошо известен, ваш подход, очевидно, будет предпочтительным. Тем не менее, я прочитал оригинальную публикацию как запрос общего подхода к чтению полных данных атрибутов. –