2010-12-14 6 views
0

J'ai du mal à récupérer des attributs personnalisés à partir d'une méthode. Comme vous pouvez le voir, la méthode ProcessXML a un attribut personnalisé. La méthode elle-même est transmise à un délégué anonyme et, dans ce contexte, je cherche à obtenir ses attributs personnalisés, mais je ne sais pas trop comment le faire.GetCustomAttributes sur un délégué anonyme

Je serais vraiment reconnaissant si quelqu'un pouvait me montrer la bonne façon de le faire. Un grand merci

Voici mon code

Public Sub UpdateXML() 

     Dim errors = New Errors 

     Dim xml = <testxml> 
         <element value="1"/> 
         <element value="2"/> 
         <element value="3"/> 
        </testxml> 

     Dim funcWithErrorTrapping = ProcessXML().WithErrorTrapping(errors) 

     Dim res = funcWithErrorTrapping(xml) 
     If errors.Count = 0 Then 
      MessageBox.Show("Success - " & res) 
     Else 
      MessageBox.Show("Failure - " & errors.Count) 
     End If 

    End Sub 

    <ThrowException(123456, "He's a very naughty boy")> 
    Private Overloads Function ProcessXML() As Func(Of XElement, String) 

     Return Function(x) 
        For Each e In x.Descendants("element") 
         e.Attribute("value").Value = "set" 
        Next 

        Throw New Exception 

        Return x.ToString 

       End Function 

    End Function 
End Class 

Public Class Errors 
    Inherits Dictionary(Of Integer, String) 
End Class 

<AttributeUsage(AttributeTargets.All, inherited:=False, AllowMultiple:=False)> 
Public NotInheritable Class ThrowException 
    Inherits Attribute 

    Private _number As Integer 
    Private _description As String 

    Public Sub New(ByVal number As Integer, ByVal description As String) 
     _number = number 
     _description = description 
    End Sub 

    Public ReadOnly Property Number As Integer 
     Get 
      Return _number 
     End Get 
    End Property 

    Public ReadOnly Property Description As String 
     Get 
      Return _description 
     End Get 
    End Property 

End Class 

Public Module Extensions 

    <Extension()> 
    Public Function WithErrorTrapping(Of T, T1)(ByVal process As Func(Of T, T1), ByVal errors As Errors) As Func(Of T, T1) 

     Return Function(a) 
        Try 
         Return process.Invoke(a) 
        Catch ex As Exception 
         Dim [exception] = process.Method.GetAttributes(Of ThrowException)()(1) 
         errors.Add([exception].Number, [exception].Description) 
        End Try 
       End Function 

    End Function 

    <Extension()> 
    Public Function GetAttributes(Of T As Attribute)(ByVal attributesProvider As ICustomAttributeProvider) 
     Dim attributes = New List(Of T) 
     For Each attr As Object In attributesProvider.GetCustomAttributes(GetType(T), False) 
      If TypeOf attr Is T Then 
       attributes.Add(TryCast(attr, T)) 
      End If 
     Next 

     Return attributes 

    End Function 

End Module 

Répondre

1

Je réalise que AOP (PostSharp) est une approche beaucoup mieux achieveing ​​ce que je voulais faire ici!

Questions connexes