2009-12-21 4 views
2

Je ne connais pas encore les attributs personnalisés, donc je me demande s'il est possible d'obtenir les valeurs des attributs. Un exemple des propriétés dans ma classe que j'utiliser les attributs personnalisés est:VB.net Valeurs des attributs personnalisés

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 

Je suis en train d'obtenir les valeurs de ces attributs (c.-à-obtenir la position = 378, Longueur = 34, etc.). . La boucle I commençait à ressembler à ceci:

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 

Cela me obtient les noms de tous les attributs, mais je ne suis pas sûr de savoir comment obtenir les valeurs. Des idées?

Cheers,

Ryan

Répondre

4

Vous aurez besoin de connaître le type de l'attribut.

Par exemple:

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

Par ailleurs, vous n'avez pas besoin de créer une nouvelle ClientGWLImport pour obtenir son objet Type.
Au lieu de cela, vous pouvez écrire

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

posAtt = tmpInfo.GetCustomAttributes (GetType (PositionAttribute), True) (0) Comme PositionAttribute ???? Nouvelle syntaxe? – Codezy

+0

Outre l'erreur de syntaxe, c'est exactement ce que je recherche. Il devrait indiquer: posAtt = CType (tmpInfo.GetCustomAttributes (GetType (PositionAttribute), True) (0), PositionAttribute) – bornbnid

+0

Désolé pour l'erreur de syntaxe; Je suis trop habitué à C#. – SLaks

0

La classe System.Reflection.CustomAttributeData expose les fonctionnalités pour récupérer la définition complète des attributs personnalisés de décoration d'un type ou d'un membre.

+0

Cela ne doit être utilisé que sur du code qui a été chargé dans un contexte de réflexion uniquement. Pour le code normal, vous devriez utiliser 'GetCustomAttributes', qui sera probablement plus rapide et certainement plus simple. Vois ma réponse. – SLaks

+0

@SLaks: Malgré le fait que la classe CustomAttributeData ait été conçue à l'origine pour prendre en charge quelque chose qui n'aurait pas fonctionné dans un contexte de réflexion uniquement, elle fonctionne parfaitement pour un assembly normalement chargé. Cela est explicitement indiqué dans la documentation: "CustomAttributeData peut être utilisé dans le contexte d'exécution ainsi que dans le contexte de réflexion uniquement." Si le type d'attribut est bien connu, votre approche serait évidemment préférable. Cependant, j'ai lu l'affichage original comme demandant une approche générale pour lire les données d'attributs complets. –

Questions connexes