2011-10-27 3 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를 사용할 수 있습니다 (시작 | 끝). 그냥 올바른 개체를 사용하지 않는 것 같습니다 .SourceContext

답변

2

핵심 문제는 FxCop 분석 엔진이 원본 컨텍스트를 멤버 바인딩에 할당하지 않는다는 것입니다. 그러나 메서드 호출에 소스 컨텍스트를 할당하므로 VisitMemberBall 재정의를 다음 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 팀이 신뢰할 수없는 경우를 생각할 수 없기 때문에 호출 된 메서드에 대한 멤버 바인딩에 해당 소스 컨텍스트를 전송하지 않기로 결정한 이유는 확실하지 않습니다. 어느 쪽이든, 거기에 없기 때문에 사용할 수 없습니다. –