2011-09-16 89 views
3

所以這裏的重複的邏輯是代碼:對各種對象

return new DistrictInfo { 
    rid = Convert.ToUInt32(((OracleNumber)o.GetOracleValue("rid")).Value), 
    doc = Convert.ToUInt16(((OracleNumber)o.GetOracleValue("doctor")).Value), 
    secdoc = Convert.ToUInt16(((OracleNumber)o.GetOracleValue("secdoctor")).Value), 
    num = Convert.ToUInt16(((OracleNumber)o.GetOracleValue("num")).Value), 
    docname = o.GetOracleValue("doctorname") as string, 
    slpuname = o.GetOracleValue("lpuname") as string, 
    reason = o.GetOracleValue("reason") as string, 
    secdocname = o.GetOracleValue("secdocname") as string 
}; 

現在我需要重寫這段代碼做了檢查對象的屬性是否存在與否。這應該是這樣的一段代碼:

DistrictInfo di; 
if (!(o["rid"].Equals(DBNull.Value)) && !(o.GetOracleValue("rid").Equals(DBNull.Value)) && (((OracleNumber)o.GetOracleValue("rid")).Value != null)) 
{ 
    di.rid = Convert.ToUInt32(((OracleNumber)o.GetOracleValue("rid")).Value); 
} 

但我發現這個代碼有些尷尬和不優雅。我做了很多檢查,因爲我想逃避例外。 所以問題是我們該如何重構這段代碼?告訴我你的想法。我認爲在這麼多檢查中是沒有必要的。我們還需要指定各種對象屬性名稱來爲所有品種成員執行一個代碼塊。我認爲有能力爲此使用LINQ。同樣在第一段代碼中,我們看到了不同的投射,所以我們需要在新代碼中提及它。 在此先感謝你們!

P.S.用於處理數據庫的庫是devArt的dotConnect for Oracle。

回答

2

我建議你使用UInt32.TryParse(),它提供了一種將原始字符串值轉換爲UInt32的安全方法,有兩種情況 - 值可以轉換爲UInt32或不能。所以基本檢查TryParse()方法的返回值,看看值是否轉換成功。

所以

string rawValue = o["rid"].ToString(); 
UInt32 parsedValue; 
if (UInt32.TryParse(rawValue, out parsedValue)) 
{ 
    // was converted successfully 
} 
else 
{ 
    // was not converted 
} 

關於這個過程中他們的名字,你還需要考慮房地產類型來處理多個屬性的自動化,所以我不能看到一個很好的方式來利用LINQ用於這一目的。

編輯:新增提案關於場變換

的自動化您可以利用的.NETExtension Methods功能,通過一組有用的方法來裝飾OracleObject類型。

public static class OracleObjectExtensions 
{ 
    public static UInt32 GetUInt32Value(this OracleObject oracleObject, string fieldName) 
    { 
     UInt32 returnValue = default(UInt32); 

     if (oracleObject[fieldName] != null) 
     { 
      string rawValue = oracleObject[fieldName].ToString(); 
      UInt32.TryParse(rawValue, out returnValue);     
     } 

     return returnValue; 
    } 

    public static UInt16 GetUInt16Value(this OracleObject oracleObject, string fieldName) 
    { 
     UInt16 returnValue = default(UInt16); 

     if (oracleObject[fieldName] != null) 
     { 
      string rawValue = oracleObject[fieldName].ToString(); 
      UInt16.TryParse(rawValue, out returnValue); 
     } 

     return returnValue; 
    } 
} 

EDIT2:Extension Methods描述

擴展方法使您「添加」方法,現有各類 而無需創建一個新的派生型,重新編譯,或以其他方式 修改原始類型。擴展方法是一種特殊的靜態方法,但它們被調用,就好像它們是擴展類型的實例方法 。

+0

提出你的方式來管理各種對象屬性。它不僅限於LINQ。謝謝! – kseen

+0

@kseen:1)什麼類型的變量2)你可以使用.NET 4.0嗎? – sll

+0

[這是解釋](http://www.devart.com/dotconnect/oracle/docs/Devart.Data.Oracle~Devart.Data.Oracle.OracleObject.html)。不,只有.NET Framework 3.5。但是如果有一些很好的功能,我們可以切換到.NET Framework 4.謝謝! – kseen