Parasoft не распознает пользовательский метод расширения IEnumerable .IsNullOrEmpty () - PullRequest
4 голосов
/ 08 апреля 2019

У нас есть собственный метод расширения .IsNullOrEmpty(), который делает именно то, что и звучит.

public static bool IsNullOrEmpty<T>(this IEnumerable<T> target)
{
  bool flag = true;
  if (target != null)
  {
    using (IEnumerator<T> enumerator = target.GetEnumerator())
    {
      if (enumerator.MoveNext())
      {
        T current = enumerator.Current;
        flag = false;
      }
    }
  }
  return flag;
}

Тем не менее, parasoft не распознает это как действительную нулевую проверку и выдает

BD.EXCEPT.NR-1: избегать исключения NullReferenceException

вскоре после использования метода расширения.

Пример:

IEnumerable<Foo> foos = _repo.GetFoos();
IEnumerable<Bar> bars;

if (!foos.IsNullOrEmpty())
{
    bars = foos.Select(foo => foo.Bar);  // This is where the Parasoft violation would occur.
}

Есть ли способ заставить Parasoft распознать наш метод расширения?

1 Ответ

1 голос
/ 08 апреля 2019

Если цель нулевая, вы не можете вызвать метод для нее, она будет бомбить.

Вам все еще нужна нулевая проверка.

if (foos != null && !foos.IsNullOrEmpty())
{
    bars = foos.Select(foo => foo.Bar);  // This is where the Parasoft violation would occur.
}

Другой подход будет заключаться всоздайте функцию, чтобы проверить, что вместо нее есть данные (противоположность вашей функции), тогда вы можете вызвать?оператор в нулевом объекте и логическое значение вернет FALSE в этом случае, что было бы желательно.

if (foos?.Any())
{
    bars = foos.Select(foo => foo.Bar);  // This is where the Parasoft violation would occur.
}
...