0

次のクラスがある場合、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の答えを考えると、おそらく私は間違った構成を使用しようとしています。私は同様のメソッドの長いリストを持っており、それらの1つが呼び出されるたびに一連の操作を実行する必要があります。それぞれに属性を付けるのが最も簡単な解決策だと思いました。なにか提案を?

4

2 に答える 2

1

分野横断的な動作をモデル化しようとしている場合 (無関係なオブジェクトが同様の/同じことを行う必要がある)、AOP が最適です。私は PostSharp を使用して、コンパイルと実行時の織りの両方で大きな効果を上げました。基本的に、コンパイル (または実行) 時に、定義に基づいてメソッドを呼び出すコンパイル済みアセンブリにコードを挿入します。

更新
RE: PostSharp: codeplex には優れたチュートリアルが多数あります。PostSharp.Laos.OnMethodBoundaryAspect から継承する新しい属性を作成する必要があります。その基本クラスのメソッドをオーバーライドすると、コンパイル中に挿入するコードがポスト コンパイラに通知されます。codeplex のそのトレース例は、実行する必要があるすべてを示しているはずです。
更新終了

見たいと思うかもしれないもう 1 つのアーキテクチャ パターンは、オブザーバーです(たとえば、簡単なグーグル検索でこの msdn 記事が見つかりました)

これらのメソッドが実際に関連するクラスのオブジェクトの動作である場合、オブザーバーはアクティビティを通知され、それに応じて応答できます。このようなパブリッシュ/サブスクライブ パターンの欠点は、依存関係のリストをオブザーバーに登録する必要があることです。クラスにたくさんのメソッドがあるだけの場合、概念はある程度当てはまりますが、必ずしも理想的ではありません。

もちろん、貧しい人々のアプローチは、すべてのメソッドの最後にコード行を追加するだけです ;-)

于 2009-03-19T22:36:49.880 に答える
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
于 2009-03-19T18:19:27.283 に答える