如何在源中使用正确的行号创建FxCop Problem()对象

时间:2011-10-27 21:43:54

标签: .net code-analysis fxcop fxcop-customrules

我创建了一个检查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。(开始|结束)LineNumber但是哪一个?似乎我只是没有使用正确的object.SourceContext

1 个答案:

答案 0 :(得分:2)

核心问题是FxCop分析引擎没有为成员绑定分配源上下文。但是,它会为方法调用分配源上下文,因此您可以使用以下VisitMethodCall覆盖替换VisitMemberBinding覆盖:

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