Как создать объект FxCop Problem () с правильным номером строки в источнике - PullRequest
2 голосов
/ 28 октября 2011

Я создал правило FxCop, которое проверяет использование DateTime.Now. Он работает довольно хорошо, за исключением того, что он сообщает номер ошибочной строки как начало метода, а не строку кода, которая фактически вызывает 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, но какой? Кажется, я просто не использую правильный объект. SourceContext

1 Ответ

2 голосов
/ 28 октября 2011

Основная проблема заключается в том, что механизм анализа 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...