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 :)

questionAnswers(1)

yourAnswerToTheQuestion