2011-10-12 44 views
0

我必須處理大量數據的項目例如過程數據,並繼續如果NULL

User u = NotMyObject.GetUser(100); 
ProcessProperty(u.FirstName); 
ProcessProperty(u.Surname); 
ProcessProperty(u.Phone.Work); 
ProcessProperty(u.Phone.Mobile); 
... 
ProcessProperty(u.Address.PostCode); 

把它所有的屬性是從的getUser(...)作爲字符串返回。什麼ProcessProperty所做的是,我希望,不相關的(也許值寫入一個文件,例如),但它看起來像:

private void ProcessProperty(string data) { 
... 
} 

我的問題是因爲u.Phone &同樣u.Address可能NULL如何在不將每個ProcessProperty(...)調用放入try/catch塊的情況下處理「用戶u」對象?

道歉,如果問題的格式不好,我仍然得到發佈掛起。

非常感謝。 N.

+0

當數據爲空時'ProcessProperty'是否產生異常? – sll

+0

@sll:如果u.Phone爲null,當您嘗試訪問其Work屬性時,它應該拋出異常... – Marco

+1

我不明白。你寫*認爲所有屬性都以GetUser(...)的形式返回爲字符串*。然後你訪問'u.Phone.Work'。您之前的聲明表明「電話」應該是一個字符串。或者實際上是這樣的,'User'暴露的屬性可以是任何類型,但我們只會將字符串傳遞給'ProcessProperty'? –

回答

1

你可以嘗試(也許它不是優雅):

ProcessProperty(u.Phone == null ? null : u.Phone.Work); 

private void ProcessProperty(string data) { 
    if (String.IsNullOrEmpty(data)) { 
     .... 
    } else { 
     .... 
    } 
} 
+0

這看起來像是直接前進的路線,當我有更多時間時,我會看看現在的東西。 – ninety

0

如果對性能至極可以是你可以編輯User類我想改變設置代碼空爲NULL轉換成的String.Empty

0

如果你有ProcessProperty功能的控制,那麼你可以只在函數內部添加此

if(data == null) return; 

否則你可以只寫這個

if(u.Phone != null) 
    ProcessProperty(u.Phone.Work); 
0

使用lambda表達式和擴展方法做一個也許單子:

public static class ObjectExt 
{ 
    public static TProp GetPropOrNull<TObj, TProp>(this TObj obj, 
     Func<User,TProp> getProp) 
     where TObj : class 
     where TProp : class 
    { 
     if (obj == null) 
      return null; 
     else 
      return getProp(obj); 
    } 
} 

用法:

u.GetPropOrNull(obj => obj.Phone).GetPropOrNull(obj => obj.Work); 
u.GetPropOrNull(obj => obj.Phone).GetPropOrNull(obj => obj.Home); 

相反使用長點鏈(如u.Phone.Work.Wh atever),如果任何第一個屬性都爲null,則該方法將失敗,此方法會短路,並在它看到null時立即返回null。如果你必須在別人的類中使用一個屬性,而這個屬性可能不是一個非常小心的程序員,那麼這可以縮短你的代碼(相對於使用if檢查)。我認爲在下面的文章中,作者使用方法名稱With而不是GetPropOrNull,因此甚至可以進一步縮短。

參考:

+0

這看起來很有趣! – ninety

0

如果你不能改變ProcessProperty考慮它包裝:

private void ProcessPropertySafe(string data) 
{ 
    if (data != null) 
    { 
     ProcessProperty(data); 
    } 
} 

或不喜歡它int.Parse()與詮釋。TryParse():

private bool TryProcessProperty(string data) 
{ 
    try 
    { 
     ProcessProperty(data); 
     return true; 
    } 
    catch // <- That's not clean ... 
    { 
     return false; 
    } 
} 
+1

ProcessPropertyWrapper的更好名稱是ProcessPropertySafe – sll

+0

@sll同意。改變了它。 – Oli

相關問題