如何从关联属性访问方法的参数?

时间:2009-03-19 18:03:11

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

鉴于以下类,我如何从SampleAttribute拦截Class1.SampleMethod的值? 感谢

Public Class Class1
    <SampleAttribute()> _
    Public Function SampleMethod(ByVal Value As Integer) As Boolean
        Return True
    End Function
End Class

<AttributeUsage(AttributeTargets.Method)> _
Public Class SampleAttribute
    Inherits System.Attribute

    Private _Value As Integer

    Property Value() As Integer
        Get
            Return _Value
        End Get
        Set(ByVal value As Integer)
            _Value = value
        End Set
    End Property

    Public Sub New()

    End Sub
End Class

编辑:

鉴于Andrew Hare的回答,也许我正在尝试使用错误的结构。我有一长串类似的方法,我需要在每次调用其中一个时执行一组操作。我认为将属性附加到每个属性将是最直接的解决方案。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果你试图模拟交叉行为(不相关的对象需要做类似/相同的事情),那么AOP是要走的路。我已经使用PostSharp产生了很好的效果,包括编译和运行时编织。它基本上会在编译(或运行)时将代码注入已编译的程序集中,这些程序集将根据您的定义调用您的方法。

<强>更新
RE:PostSharp:codeplex上有很多好的教程。您需要构建一个继承自PostSharp.Laos.OnMethodBoundaryAspect的新属性。覆盖该基类中的方法将告诉后编译器在编译期间要插入哪些代码。 Codeplex上的跟踪示例应该向您展示您需要做的一切 的 EndUpdate

您可能希望查看的另一种架构模式是observer(例如a quick google found this msdn article)

如果这些方法实际上是某些相关类中的对象行为,则可以向观察者通知活动,然后相应地做出响应。像这样的发布 - 订阅模式的缺点是您需要向观察者注册您的家属列表。如果你在类上有一堆方法,那么这个概念仍然有些成立,但不一定是理想的。

当然,穷人/女人的方法是在所有方法的末尾添加一行代码; - )

答案 1 :(得分:0)

编辑:

听起来你正试图通过AOP做点什么。也许像PostSharp这样的东西会有所帮助 - 它可以让你通过属性做你想做的事。


鉴于你发布的类型尝试这样的事情:

Imports System
Imports System.Reflection

Class Program
    Private Shared Sub Main()
        Dim type As Type = GetType(Class1)
        Dim members As MemberInfo() = type.GetMembers()

        For Each member As MemberInfo In members
            Dim attributes As Object() = member.GetCustomAttributes(GetType(SampleAttribute), True)

            If attributes.Length > 0 Then
                ' this means that the current "member"
                ' has your custom attribute
            End If
        Next
    End Sub
End Class