C# 各种对象的可重复逻辑

C# 各种对象的可重复逻辑,c#,.net,linq,oracle,refactoring,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

下面是代码:

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。

我建议您使用它,它提供了将原始字符串值转换为
UInt32
的安全方法,有两种情况-值可以转换为UInt32,也可以不转换。所以基本上检查
TryParse()
方法的返回值,看看值是否成功转换

所以

关于这个过程的自动化来处理多个属性的名称,您也需要考虑属性类型,所以我不能看到一个很好的方法来利用LINQ来实现这个目的。 编辑:添加了关于字段转换自动化的建议

您可以利用
.NET
的功能,通过一组有用的方法来修饰
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:说明

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


提出管理各种对象属性的方法。它不仅限于林克。谢谢@kseen:1)什么类型的o变量2)可以使用.NET4.0?。没有,只有.NETFramework 3.5。但是如果有一些好的特性,我们可以切换到.NETFramework4。谢谢@克辛:看我答案的编辑部分。作为一个例子,我建议为OracleObject类引入一组扩展方法,它封装了字段转换逻辑。您可以通过添加一些私有方法来改进extension methods类,以简化空值检查并避免在所有扩展方法中复制相同的块,但我在现有项目的许多部分中都使用此类,因此我无法快速将
OracleObject
重写为
OracleObjectExtensions
。但这个主意很好。谢谢
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;
    }
}