2

DateTime.Now の使用をチェックする FxCop ルールを作成しました。実際に DateTime.Now を呼び出すコード行ではなく、問題のある行番号をメソッドの開始として報告することを除いて、これは非常にうまく機能します。FxCop レポートで正しい行番号を取得するにはどうすればよいですか。これが私のコードです:

public override void VisitMemberBinding(MemberBinding memberBinding)
{
   string name = memberBinding.BoundMember.FullName;
   if (name == "System.DateTime.get_Now")
   {
      Problems.Add(new Problem(GetResolution(), memberBinding.BoundMember.SourceContext));
   }

   base.VisitMemberBinding(memberBinding);
}

memberBinding.SourceContext と memberBinding.BoundMember.SourceContext を試しましたが、どちらもメソッドの開始行番号を返します。

SourceContext.(Start|End)LineNumber を使用できますが、どれですか? 私は正しいobject.SourceContextを使用していないようです

4

1 に答える 1

2

中心的な問題は、FxCop 分析エンジンがソース コンテキストをメンバー バインディングに割り当てないことです。ただし、ソース コンテキストをメソッド呼び出しに割り当てるため、VisitMemberBinding オーバーライドを次の VisitMethodCall オーバーライドに置き換えることができます。

public override void VisitMethodCall(MethodCall call)
{
    string name = ((MemberBinding)call.Callee).BoundMember.FullName;
    if (name == "System.DateTime.get_Now")
    {
        this.Problems.Add(new Problem(this.GetResolution(), call));
    }

    base.VisitMethodCall(call);
}
于 2011-10-28T12:22:15.487 に答える