2

私は C# である種のアスペクト指向プログラミングを実装しようとしていますが、いくつかの小さな成功はありましたが、いくつかの重要な制限が見つかりました。

これらの制限の 1 つは、静的メソッドへの呼び出しをインターセプトする機能です。たとえば、次のオブジェクトがあるとします。

public class SampleObject  
{
    public SampleObjectProperty { get; set; }  

    public SampleObject(int anInteger) { this.SampleObjectProperty = anInteger; }

    public int SampleObjectMethod(int aValue) 
    { 
        return aValue + this.SampleObjectProperty; 
    }

    public static string GetPI() { return Math.PI.ToString(); }
}

呼び出し元は次のようになります。

[Intercept]
public class Caller : ContextBoundObject
{
    static void Main(string[] args)
    {
        SampleObject so = new SampleObject(1); // Intercepted successfully.
        so.SampleObjectProperty;               // Idem.
        so.SampleObjectProperty = 2;           // Idem.
        so.SampleObjectMethod(2);              // Idem.

        // The next call (invocation) executes perfectly, but is not intercepted.
        SampleObject.GetPI(); // NOT INTERCEPTED :(        
    }
}

私が持っているコードでは、コンストラクター、インスタンス メソッド、およびプロパティ (get および set) をインターセプトできますが、静的メソッドはインターセプトできません。

静的メソッド呼び出しをキャプチャする方法について何か提案やアイデアはありますか?

4

1 に答える 1

4

私が見た AOP ツールは、他の手法を使用して静的メソッドのインターセプトを許可しています。特に、コンパイル後にコードを変更して必要なインターセプト命令を挿入する PostSharp について考えています。

詳細については、 http://www.postsharp.org/を参照してください。

ContextBoundObject 手法を使用したインターセプトは、インスタンス メソッドのみに制限されています。

于 2010-02-10T17:10:55.560 に答える