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;
}
}