NET SqlDataReader对象赋值,有没有简单的方法处理一下,不用写这么多死代码! 对象dr 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 取得ColumnName,利用反射进行赋值。 很遗憾的告诉你,如果你确实有300个字段需要赋值,那不管你用什么方法,最后还是要至少写300行字段。至于小的优化,倒是可以做一点,比如这里:dr["to_cn_coutry"] == DBNull.Value ? "" : dr["to_cn_coutry"].ToString();很显然,可以把SqlDataReader dr拓展一下,改成public static String getString(this SqlDataReader reader, string field){ return reader[field] == DBNull.Value ? string.Empty : reader[field].ToSTring();}并且,何必要用SqlDataReader,直接用IDataReader不可以吗?如果无特殊需求,最好把参数要求“放开”一些。我不提倡用反射,因为没有什么必要。我们当然希望代码越干净越好,但是很多时候不要为了干净而去做一些overkill的事情。反射可以用,但是应该用在更“聪明”的地方。 嗯,我已经用反射解决了,谢谢各位大神,一次发帖,CSDN果然都是大神!代码如下: public static void SetValueFromObj2(object obj, SqlDataReader dr) { Type type1 = obj.GetType(); foreach (PropertyInfo property in type1.GetProperties()) { string name = property.Name; if (name != "order_id_info") { if (property.PropertyType.ToString() == "System.String") { property.SetValue(obj, dr[name] == DBNull.Value ? string.Empty : dr[name].ToString(), null); } else if (property.PropertyType.ToString() == "System.Int32" || property.PropertyType.ToString() == "System.Double" || property.PropertyType.ToString() == "System.Decimal" || property.PropertyType.ToString() == "System.Single") { property.SetValue(obj, dr[name] == DBNull.Value ? 0 : dr[name], null); } else if (property.PropertyType.ToString() == "System.DateTime") { property.SetValue(obj, dr[name] == DBNull.Value ? DateTime.MinValue : Convert.ToDateTime(dr[name]), null); } } } } 高手进 UDPSocket控件 datagrowview中的数据问题 Report1.rdlc 文件的设置 按纽 TEXT和BackgroundImage 如何解决winforms刷新问题? 用什么控件可以在Winform程序中像IE一样解析HTML代码 C#winform问题,请前辈们回答 C#如何输出根号3啊,根号2,根号X之类的,用造字程序造新字符添加到Unicode字符集,还是用GDI,请问有什么好办法 介绍几款C#下的ORM(对象关系映射)工具 Where are System.Net? c# 如何简化代码? vs2010 chart控件X轴间距设置问题
dr["to_cn_coutry"] == DBNull.Value ? "" : dr["to_cn_coutry"].ToString();
很显然,可以把SqlDataReader dr拓展一下,改成
public static String getString(this SqlDataReader reader, string field)
{
return reader[field] == DBNull.Value ? string.Empty : reader[field].ToSTring();
}并且,何必要用SqlDataReader,直接用IDataReader不可以吗?如果无特殊需求,最好把参数要求“放开”一些。我不提倡用反射,因为没有什么必要。我们当然希望代码越干净越好,但是很多时候不要为了干净而去做一些overkill的事情。反射可以用,但是应该用在更“聪明”的地方。
public static void SetValueFromObj2(object obj, SqlDataReader dr)
{
Type type1 = obj.GetType();
foreach (PropertyInfo property in type1.GetProperties())
{
string name = property.Name;
if (name != "order_id_info")
{
if (property.PropertyType.ToString() == "System.String")
{
property.SetValue(obj, dr[name] == DBNull.Value ? string.Empty : dr[name].ToString(), null);
}
else if (property.PropertyType.ToString() == "System.Int32" || property.PropertyType.ToString() == "System.Double" || property.PropertyType.ToString() == "System.Decimal" || property.PropertyType.ToString() == "System.Single")
{
property.SetValue(obj, dr[name] == DBNull.Value ? 0 : dr[name], null);
}
else if (property.PropertyType.ToString() == "System.DateTime")
{
property.SetValue(obj, dr[name] == DBNull.Value ? DateTime.MinValue : Convert.ToDateTime(dr[name]), null);
}
} }
}