GetCustomAttributes在匿名委托上

时间:2010-12-14 17:42:45

标签: vb.net custom-attributes anonymous-methods

我正在努力从方法中检索自定义属性。如您所见,ProcessXML方法具有自定义属性。方法本身被传递到一个匿名委托,然后,在那个上下文中,我想要获得它的自定义属性,但我不知道如何做到这一点。

如果有人能告诉我正确的方法,我真的很感激。非常感谢

这是我的代码

    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

1 个答案:

答案 0 :(得分:1)

所以我意识到AOP(Postsharp)是一个更好的方法来实现我在这里尝试做的事情!

相关问题