2011-10-27 17 views
2

DateTime.Nowの使用をチェックするFxCopルールを作成しました。これは、実際にDateTime.Nowを呼び出すコード行ではなく、メソッドの開始点として問題の行番号を報告する点を除いて、うまく機能します。 FxCopレポートで正しい行番号を取得するには、何が必要ですか。ここに私のコードです:正しい行番号を持つFxCop Pro blem()オブジェクトを作成する方法

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を使用することができました(開始|終了)LineNumber?私はちょうど正しいオブジェクトを使用していないと思われます。ソースコンテキスト

答えて

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); 
} 
+0

ありがとう、ありがとう!だからVisitMemeberBindingはDateTime.Nowプロパティの内部で発生し、VisitMethodCallはDateTime.Nowが呼び出されたときに発生しますか?それとも別の方法ですか? – slolife

+1

VisitMemberBindingは、実際にVisitMethodCallベースによって呼び出されます。ただし、メソッド呼び出しには、ソースコンテキストがPDBファイルで追跡される命令なので、利用可能な追加のメタデータがあります。私はFxCopチームが、なぜ信頼できない場合も考えられないので、呼び出されたメソッドのメンバーバインディングにそのソースコンテキストを転送することを選択しなかったのかどうかはよく分かりません。どちらにしても、そこにはないので、使用することはできません。 –

関連する問題