Как лучше справиться с этим исключением? - PullRequest
0 голосов
/ 26 октября 2018

Я пытался перечислить через свойства класса и получить их значения в списке строк. Но я столкнулся с проблемой, когда я получаю исключение NullReferenceException, когда значение равно нулю из свойств

Мне удалось это исправить с помощью этого решения, но все же я не вижу в этом чистого кода.

Мне интересно, может ли это быть реализовано более чисто и профессионально.

    private int CalculateScore()
    {
        var score = 0;
        var answers = new List<string>();
        foreach (var prop in typeof(TypesSheet).GetProperties())
        {
            // WHEN STRING IS MISSING IT BREAKS
            try
            {
                var answer = prop.GetValue(_typesSheet).ToString();
                answers.Add(answer);
            }
            catch
            {
                continue;
            }


        }

        if (_gameMode == GameMode.SinglePlayer)
        {
            foreach (var answer in answers)
            {
                if (string.IsNullOrEmpty(answer))
                    continue;

                score = score + 10;
            }

            return score;
        }
  }

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Использование Оператор безопасной навигации (доступно в C # 6)

var answer = prop.GetValue(_typesSheet)?.ToString();
if (!string.IsNullOrEmpty(answer)) answers.Add(answer);

Версия Linq

var answers = typeof(TypesSheet)
                .GetProperties()
                .Select(prop => prop.GetValue(_typesSheet)?.ToString())
                .Where(answer => !string.IsNullOrEmpty(answer))
                .ToList();
0 голосов
/ 26 октября 2018

Заменить:

// WHEN STRING IS MISSING IT BREAKS
try
{
    var answer = prop.GetValue(_typesSheet).ToString();
    answers.Add(answer);
}
catch
{
    continue;
}

С:

var value = prop.GetValue(_typesSheet);
if (null != value)
{
    answers.Add(value.toString());
}
0 голосов
/ 26 октября 2018

Ошибка была вызвана prop.GetValue(_typesSheet) может быть null.при использовании ToString метод получит

nullreferenceexception

Вы можете попробовать использовать linq вместо foreach.

var answers =
    typeof(TypesSheet).GetProperties()
    .Select(x => x.GetValue(_typesSheet))
    .Where(x=> x!= null)
    .Select(x=> x.ToString());
0 голосов
/ 26 октября 2018
if (prop.GetValue(_typesheets) != null) {
    answers.Add(prop.GetValue(_typesheets));
}
...