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 回答