Nombre de propiedad totalmente calificado

Estoy tratando de prevenir System.NullReferenceException.

Tengo una empresa, que tiene una colección de empleados. Cada empleado tiene una colección de habilidades.

SelectedEmployee apunta al elemento actualmente seleccionado dentro de la colección Employee.

SelectedSkill apunta al elemento seleccionado actualmente dentro de la colección de habilidades.

Tengo un ListView que tiene su ItemSource vinculado a la colección Skills; SelectedItem de ListView está vinculado a SelectedSkill.

Cuando se elimina una habilidad, quiero que ListView se desplace al último elemento.

private void DeleteSelectedSkillFromSelectedEmployee()
{
    Company.SelectedEmployee.Skills.Remove(Company.SelectedEmployee.SelectedSkill);
    EmployeeSkillsListView.ScrollIntoView(Company.SelectedEmployee.Skills.Last());
}

Si no se ha seleccionado un empleado, entonces SelectedEmployee será nulo. Esto provocará una excepción System.NullReferenceException al hacer algo dentro del método.

NOTA: He usado un método de extensión para reemplazar .Last () para que no se produzca un error en una colección vacía.

Para evitar esto, uso un 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;
    }
}

Entonces ahora se ve así:

private void DeleteSelectedSkillFromSelectedEmployee()
{
    if(Utils.PropertyExists(Company, "SelectedEmployee.SelectedSkill"))
    {
         Company.SelectedEmployee.Skills.Remove(Company.SelectedEmployee.SelectedSkill);
         EmployeeSkillsListView.ScrollIntoView(Company.SelectedEmployee.Skills.Last());
    }
}

Todo lo anterior funciona bien. No es el escenario exacto o el código, así que no te preocupes por corregir nada de lo anterior (solo asume que funciona bien). Es solo la pregunta a continuación que estoy realmente interesado en descubrir.

(Imagine para esto que SelectedEmployee y SelectedSkill no son nulos)

¿Hay alguna forma de obtener el nombre completo de una propiedad? Entonces podría hacer algo como:

if(Utils.PropertyExists(Company, GetFullyQualifiedName(Company.SelectedEmployee.SelectedSkill)))

Donde GetFullyQualifiedName (Object) devuelve "Company.SelectedEmployee.SelectedSkill".

Segunda parte de la pregunta: Imagine que SelectedEmployee es nulo: ¿Hay alguna forma de permitir que se pase una NullReference a un método? Estoy 99.9% seguro de que la respuesta es no :)

Respuestas a la pregunta(1)

Su respuesta a la pregunta