Как создать объект FxCop Problem() с правильным номером строки в источнике
Я создал правило 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 ответ
Основная проблема заключается в том, что механизм анализа 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);
}