Полностью квалифицированное название недвижимости
Я пытаюсь предотвратить System.NullReferenceException.
У меня есть компания, в которой есть коллекция сотрудников. У каждого сотрудника есть коллекция навыков.
SelectedEmployee указывает на текущий выбранный элемент в коллекции Employee.
SelectedSkill указывает на текущий выбранный элемент в коллекции умений.
У меня есть ListView, его ItemSource привязан к коллекции навыков; SelectedItem объекта ListView привязан к SelectedSkill.
Когда навык удален, я хочу, чтобы ListView прокрутил до последнего элемента.
private void DeleteSelectedSkillFromSelectedEmployee()
{
Company.SelectedEmployee.Skills.Remove(Company.SelectedEmployee.SelectedSkill);
EmployeeSkillsListView.ScrollIntoView(Company.SelectedEmployee.Skills.Last());
}
Если Сотрудник не был выбран, то SelectedEmployee будет нулевым. Это вызовет исключение System.NullReferenceException при выполнении каких-либо действий внутри метода.
ПРИМЕЧАНИЕ. Я использовал метод расширения для замены .Last (), чтобы он не выдавал ошибку в пустой коллекции.
Чтобы обойти это, я использую метод Util:
public static class Utils
{
public static bool PropertyExists(Object obj, String name)
{
foreach (String part in name.Split('.'))
{
if (obj == null) { return false; }
Type type = obj.GetType();
System.Reflection.PropertyInfo info = type.GetProperty(part);
if (info == null) { return false; }
obj = info.GetValue(obj, null);
}
return obj != null;
}
}
Итак, теперь это выглядит так:
private void DeleteSelectedSkillFromSelectedEmployee()
{
if(Utils.PropertyExists(Company, "SelectedEmployee.SelectedSkill"))
{
Company.SelectedEmployee.Skills.Remove(Company.SelectedEmployee.SelectedSkill);
EmployeeSkillsListView.ScrollIntoView(Company.SelectedEmployee.Skills.Last());
}
}
Все выше работает отлично. Это не точный сценарий или код, поэтому не беспокойтесь о том, чтобы что-то исправить выше (просто предположите, что он работает нормально). Это просто вопрос ниже, я действительно заинтересован в выяснении.
(Представьте себе, что SelectedEmployee и SelectedSkill не равны нулю)
Есть ли способ получить полное имя собственности? Так что я мог бы сделать что-то вроде:
if(Utils.PropertyExists(Company, GetFullyQualifiedName(Company.SelectedEmployee.SelectedSkill)))
Где GetFullyQualifiedName (Object) возвращает «Company.SelectedEmployee.SelectedSkill».
Вторая часть вопроса: представьте, что SelectedEmployee имеет значение null: есть ли способ разрешить передачу NullReference методу? Я на 99,9% уверен, что ответ нет :)