Vollqualifizierter Eigenschaftsname

Ich versuche, System.NullReferenceException zu verhindern.

Ich habe eine Firma, die eine Sammlung von Mitarbeitern hat. Jeder Mitarbeiter hat eine Sammlung von Fähigkeiten.

SelectedEmployee zeigt auf das aktuell ausgewählte Element in der Employee-Auflistung.

SelectedSkill zeigt auf das aktuell ausgewählte Element in der Sammlung von Skills.

Ich habe eine ListView, deren ItemSource an die Skills-Auflistung gebunden ist. Das SelectedItem der ListView ist an den SelectedSkill gebunden.

Wenn ein Skill gelöscht wird, soll die ListView zum letzten Element scrollen.

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

Wenn kein Mitarbeiter ausgewählt wurde, ist SelectedEmployee null. Dies führt zu einer System.NullReferenceException, wenn innerhalb der Methode etwas ausgeführt wird.

HINWEIS: Ich habe eine Erweiterungsmethode verwendet, um .Last () zu ersetzen, damit bei einer leeren Sammlung kein Fehler auftritt.

Um das zu umgehen, benutze ich eine Util-Methode:

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;
    }
}

So sieht es jetzt so aus:

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

Alles oben funktioniert gut. Es ist nicht das exakte Szenario oder der exakte Code, also machen Sie sich keine Sorgen darüber, ob etwas oben korrigiert wird (nehmen Sie einfach an, dass es gut funktioniert). Es ist nur die Frage unten, die mich wirklich interessiert.

(Stellen Sie sich vor, SelectedEmployee und SelectedSkill sind nicht null)

ibt es eine Möglichkeit, den vollständigen Namen einer Immobilie zu ermitteln? Also könnte ich so etwas machen:

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

Wo GetFullyQualifiedName (Object) "Company.SelectedEmployee.SelectedSkill" zurückgibt.

Zweiter Teil der Frage: Stellen Sie sich vor, SelectedEmployee ist null: Gibt es eine Möglichkeit, die Übergabe einer NullReference an eine Methode zuzulassen? Ich bin mir zu 99,9% sicher, dass die Antwort nein ist:)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage