如何以更简洁的方式处理此异常?

How to handle this exception in a cleaner way?

我一直在尝试枚举 class 的属性并在字符串列表中获取它们的值。 但是我遇到了一个问题,当属性

的值为 null 时,我得到了一个 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;
        }
  }
if (prop.GetValue(_typesheets) != null) {
    answers.Add(prop.GetValue(_typesheets));
}

替换:

// 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());
}

错误是由 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());

使用安全导航运算符(在 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();