Я пытался перечислить свойства класса и получить их значения в списке строк. Но я столкнулся с проблемой, когда я получаю исключение NullReferenceException, когда значение null из свойств
Мне удалось исправить это с помощью этого решения, но все же я не считаю это чистым кодом.
Интересно, можно ли это реализовать более чистым и профессиональным способом.
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());
}
Программа аварийно завершает работу до того, как достигнет условия if.
о, это было о 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();
Пробный улов - ужасная идея. В конечном итоге вы проглатываете фатальные исключения. А их проглатывание - смертный грех обработки исключений: blogs.msdn.microsoft.com/ericlippert/2008/09/10/… | codeproject.com/Articles/9538/… Это исключение очень тупоголовое. Очевидным решением было бы проверить значение null перед его использованием. Помимо простого кода
if (x != null)
, существует множество сокращений, таких как оператор объединения с нулевым значением и условные операторы с нулевым значением.