0

私は監査部分に取り組んでおり、追加情報のために監査に記録する必要があるメソッドにパラメーターをマークするために属性を使用しようとしています。しかし、どういうわけか、属性が存在するかどうかを確認できないようです。

私のコード:

  [Audit(AuditType.GetReport)]
  public Stream GetReportStream([AuditParameter] Report report)
  {
     ...
  }

  [AttributeUsage(AttributeTargets.Parameter)]
  public class AuditParameterAttribute : Attribute
  {
  }

そして、私がそれを取得しようとしているインターセプターの内部:

foreach (ParameterInfo param in invocation.Method.GetParameters ())
{
   var atts = CustomAttributeData.GetCustomAttributes (param);
   if (param.IsDefined (typeof(AuditParameterAttribute), false))
   {
      attributes.Add (param.Name, invocation.Arguments[param.Position].ToString ());
   }
}

私は何かを機能させるためにいくつかの追加の呼び出しを追加し始めました。余分なものがそこにあるのはなぜですかvar atts。変数には呼び出されたメソッドに関する情報があり、そこinvocationからパラメーターを表すParameterInfoオブジェクトを取得できます。しかし、何を試しても、カスタム属性を取得することはできません。

私はここで何が間違っているのですか?

4

1 に答える 1

2

とった。キャッスルを使用した経験がなかったことが問題だったことがわかりました。呼び出されたクラスのインターフェイスに基づいてプロキシを経由していることに気付きましたが、これには探していた属性がありませんでした。したがって、私のコードを次のように変更します。

foreach (ParameterInfo param in invocation.MethodInvocationTarget.GetParameters ())
{
   if (param.IsDefined (typeof(AuditParameterAttribute), false))
   {
      attributes.Add (param.Name, invocation.Arguments[param.Position].ToString ());
   }
}

Method の代わりに MethodInvocationTarget を使用すると、問題が修正されました。

于 2012-04-18T18:17:22.847 に答える