0

メソッド属性が呼び出されたときにデバッガーを停止しようとしていますが、ブレークポイントに到達していないようです。ここで何かが足りませんか?

[SecurityImpl("test")]
public void test()
{

}

[AttributeUsage(AttributeTargets.All)]
public class SecurityImplAttribute : Attribute
{
    public SecurityImplAttribute(string test)
    {
        //Break Point Here    
    }
 }
4

3 に答える 3

2

属性はメタデータのみです。リフレクション ( ) を使用しない限り、実際にはインスタンスとして作成さGetCustomAttributesれません。PostSharp などの AOP フレームワークを使用するか、属性の特定のカテゴリをチェックしてそれらを明示的にインスタンス化/呼び出すフレームワークを使用していない限り (ASP.NET MVC のように)、属性を使用して任意のコード呼び出しを追加することはできません。

于 2012-07-17T12:20:06.887 に答える
1

属性は単なるデコレータであり、.net フレームワークでは実行されません。

于 2012-07-17T12:20:18.323 に答える
1

属性は、コードの単なるメタデータです。それらは自動的に実行されません。何らかのメタデータを使用する場合は、手動で取得して実行する必要があります。あなたの場合、メソッドのカスタム属性を取得しようとすると、属性のコンストラクターが実行されます。

object[] attributes = methodInfo.GetCustomAttributes(true);

メソッドを呼び出すときに一部のアスペクトを自動的に実行する場合は、PostSharpなどの AOP フレームワークを使用できます。メソッド呼び出しでいくつかのアクションを実行するアスペクト作成の例を次に示します。

[Serializable]
public class SecurityImplAttribute : OnMethodBoundaryAspect
{
   public override void OnEntry(MethodExecutionArgs args) 
   { 
      // this code will be executed on method call
   }   
}

この属性を何らかのメソッドに適用すると、PostSharp はコンパイル中にメソッドのメタデータを読み取り、アスペクトが見つかった場合、PostSharp はコードをバイナリに直接挿入します。

于 2012-07-17T12:23:44.560 に答える