I am struggling to retrieve custom attributes from a method. As you can see, the method ProcessXML has a custom attribute. The method itself gets passed into an anonymous delegate and then, in that context, I'm looking to get its custom attributes, but I'm not sure quite how to do it.
I'd be really grateful if someone could show me the proper way to do it. Many thanks
Here's my 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
So I realised that AOP (Postsharp) was a much better approach to achieveing what I was trying to do here!