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