Nome completo da propriedade
Estou tentando impedir System.NullReferenceException.
Eu tenho uma empresa, que tem uma coleção de funcionários. Cada funcionário tem uma coleção de habilidades.
SelectedEmployee aponta para o elemento atualmente selecionado na coleção Employee.
SelectedSkill aponta para o elemento atualmente selecionado na coleção de Skills.
Eu tenho um ListView que tem seu ItemSource vinculado à coleção Skills; SelectedItem do ListView está vinculado ao SelectedSkill.
Quando uma Habilidade é excluída, quero que o ListView role para o último elemento.
private void DeleteSelectedSkillFromSelectedEmployee()
{
Company.SelectedEmployee.Skills.Remove(Company.SelectedEmployee.SelectedSkill);
EmployeeSkillsListView.ScrollIntoView(Company.SelectedEmployee.Skills.Last());
}
Se um funcionário não tiver sido selecionado, o SelectedEmployee será nulo. Isso causará um System.NullReferenceException ao fazer qualquer coisa dentro do método.
OBSERVAÇÃO: usei um método de extensão para substituir .Last (), para que não ocorra erro em uma coleção vazia.
Para contornar isso, eu uso o método 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;
}
}
Então agora fica assim:
private void DeleteSelectedSkillFromSelectedEmployee()
{
if(Utils.PropertyExists(Company, "SelectedEmployee.SelectedSkill"))
{
Company.SelectedEmployee.Skills.Remove(Company.SelectedEmployee.SelectedSkill);
EmployeeSkillsListView.ScrollIntoView(Company.SelectedEmployee.Skills.Last());
}
}
Tudo acima funciona bem. Não é o cenário exato ou o código, portanto, não se preocupe em corrigir nada acima (suponha que funcione bem). É apenas a pergunta abaixo que estou realmente interessada em descobrir.
(Imagine por isso que SelectedEmployee e SelectedSkill não são nulos)
Existe alguma maneira de obter o nome completo de uma propriedade? Então eu poderia fazer algo como:
if(Utils.PropertyExists(Company, GetFullyQualifiedName(Company.SelectedEmployee.SelectedSkill)))
Onde GetFullyQualifiedName (Object) retorna "Company.SelectedEmployee.SelectedSkill".
Segunda parte da pergunta: Imagine que SelectedEmployee é nulo: existe alguma maneira de permitir que um NullReference seja passado para um método? Tenho 99,9% de certeza que a resposta é não :)