2010-12-14 72 views
0

我很努力從方法檢索自定義屬性。如您所見,ProcessXML方法具有自定義屬性。該方法本身被傳遞給一個匿名委託,然後,在這種情況下,我正在尋找它的自定義屬性,但我不知道該怎麼做。匿名代理的GetCustomAttributes

如果有人能告訴我正確的做法,我會很感激。非常感謝

這裏是我的代碼

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

所以我意識到,AOP(Postsharp)是achieveing什麼,我想在這裏做一個更好的方法!