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