各种对象的可重复逻辑
本文关键字:对象 | 更新日期: 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
扩展方法使您能够向现有类型"添加"方法而无需创建新的派生类型、重新编译或以其他方式修改原类型。扩展方法是一种特殊的方法静态方法,但是调用它们时就好像它们是实例方法一样扩展类型。