2011-09-16 62 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