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

时间:2018-10-26 18:30:39

标签: c# foreach nullreferenceexception

我一直试图通过类的属性进行枚举,并将它们的值存储在字符串列表中。 但是我遇到一个问题,当属性中的值为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;
        }
  }

4 个答案:

答案 0 :(得分:2)

替换:

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

答案 1 :(得分:1)

if (prop.GetValue(_typesheets) != null) {
    answers.Add(prop.GetValue(_typesheets));
}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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