3

すべて。たぶん私は十分にグーグルしていませんが、私はこの質問の例を見つけることができません。

C#では、クラスに適用され、そのすべてのメソッドを変更するカスタム属性を作成することができますか?たとえばConsole.WriteLine("Hello, i'm modified method");、最初の行として追加します(または、実行時に実行する場合はILと同等です)。

4

2 に答える 2

7

はい、できますが、C# には組み込まれていません。エリックが言うように、この手法はアスペクト指向プログラミングとして知られています。

仕事でPostSharpを使用しましたが、非常に効果的です。コンパイル時に機能し、他の AOP 手法とは対照的に、IL ウィービングを使用します。

たとえば、次の属性は、必要なことを行います。

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method | MulticastTargets.Class,
                         AllowMultiple = true,
                         TargetMemberAttributes = MulticastAttributes.Public | 
                                                  MulticastAttributes.NonAbstract | 
                                                  MulticastAttributes.Managed)]
class MyAspect : OnMethodInvocationAspect
{
    public override void OnInvocation(MethodInvocationEventArgs eventArgs)
    {
        Console.WriteLine("Hello, i'm modified method");

        base.OnInvocation(eventArgs);
    }
}

MyAspectクラスの属性として適用するだけで、その中のすべてのメソッドに適用されます。TargetmemberAttributesプロパティのプロパティを変更することで、アスペクトの適用方法を制御できMulticastAttributeUsageます。この例では、公開された非抽象メソッドのみに適用されるように制限したいと考えています。

できることは他にもたくさんありますので、(AOP 全般を参照してください) を参照してください。

于 2009-11-01T08:22:50.347 に答える
6

いいえ。探しているのはアスペクト指向プログラミング(AOP)です。

AOPを使用して、ポイントカット、コードを織り込む場所、およびその時点で実行するコードを指定します。トレースはAOPの標準的な例です。メソッドのセットとウィーバー/コンパイラーを指定して、そのメソッドの最初または最後にログ/トレース呼び出しを追加します。

于 2009-11-01T07:49:01.943 に答える