各种对象的可重复逻辑

时间:2011-09-16 09:47:36

标签: c# .net linq oracle refactoring

所以这是代码:

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。

1 个答案:

答案 0 :(得分: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。

编辑:添加了有关字段转换自动化的提案

您可以利用.NET的{​​{3}}功能通过一组有用的方法来装饰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说明

  

扩展方法使您可以向现有类型“添加”方法   无需创建新的派生类型,重新编译或其他方式   修改原始类型。扩展方法是一种特殊的方法   静态方法,但它们被称为就像它们是实例方法一样   扩展类型。