我試圖防止System.NullReferenceException。完全合格的屬性名稱
我有一個公司,其中有員工的集合。每個員工都有一系列技能。
SelectedEmployee指向Employee集合中當前選定的元素。
SelectedSkill指向技能集合中當前選定的元素。
我有一個ListView的ItemSource綁定到Skills集合; ListView的SelectedItem綁定到SelectedSkill。
當技能被刪除時我希望ListView滾動到最後一個元素。
private void DeleteSelectedSkillFromSelectedEmployee()
{
Company.SelectedEmployee.Skills.Remove(Company.SelectedEmployee.SelectedSkill);
EmployeeSkillsListView.ScrollIntoView(Company.SelectedEmployee.Skills.Last());
}
如果沒有選擇員工,則SelectedEmployee將爲空。這將在方法內部執行任何操作時導致System.NullReferenceException。
注:我已經使用擴展方法來替換.Last(),因此它不會在空集合上出錯。
爲了解決這個問題我使用一個實用程序方法:
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不爲null)
有沒有得到一個屬性的完全合格的名稱的方法嗎? 所以,我可以這樣做:
if(Utils.PropertyExists(Company, GetFullyQualifiedName(Company.SelectedEmployee.SelectedSkill)))
凡GetFullyQualifiedName(Object)返回 「Company.SelectedEmployee.SelectedSkill」。
問題的第二部分:想象一下SelectedEmployee爲null:是否有任何方法允許將NullReference傳遞給方法? 我99.9%肯定答案是否定的:)
你爲什麼用反射煩心事字符串?爲什麼不簡單檢查'Company.SelectedEmployee!= null'? – Jamiec
想象一下,一個屬性有多少個零件;其中任何一個都可能爲空。 A.B.C.D.E.F.G.H.SelectedSkill。我不想有一個巨大的If語句來檢查每一個。 – James