各种对象的可重复逻辑

本文关键字:对象 | 更新日期: 2023-09-27 18:08:41

代码如下:

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来实现。同样在第一段代码中,我们看到了不同的类型转换,所以我们需要在新代码中提到它。提前感谢各位!

注:

各种对象的可重复逻辑

我建议你使用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来实现这个目的。

EDIT:新增关于字段转换自动化的建议

您可以利用.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: Extension Methods description

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