小弟今天写了一个方法,使用反射来查询数据。在GetSetMethod().Invoke()方法使用后,如果字段为null,则在set的时候会报类型转化错误。具体代码我已经贴出来,求大神指导下怎么避免此问题。万分感谢!
public T GetObjectByID(int id) { //T为传值进来的实体 //select * from tablename where id=@id object result = null; string tableName = type.Name; StringBuilder sb = new StringBuilder(); sb.Append("select * from "); sb.Append(tableName); sb.Append(" where "); PropertyInfo[] pi = type.GetProperties(); PropertyInfo pi1 = pi[0]; sb.Append(pi1.Name); sb.Append("=@"); sb.Append(pi1.Name); SqlParameter[] param = new SqlParameter[] { new SqlParameter("@"+pi1.Name,id) }; using (SqlDataReader read = DBUtility.SqlHelpDao.ExecuteReader(DBUtility.Constance.Constr, CommandType.Text, sb.ToString(), param)) { if (read != null) { result = Activator.CreateInstance(type); while (read.Read()) { int colindex = 0; foreach (PropertyInfo item in pi) { item.GetSetMethod().Invoke(result, new object[] { read[colindex] });//在使用Invoke的时候,比如我数据库有个字段允许为空null,我在read[colindex]=null,这样就会出现无法将null转化成string类型的错误,这样情况怎么处理呢? colindex++; } } } } return (T)result; }
为什么不分别调用GetValue和SetValue方法,而要Invoke呢?
对数据库中取出的数据判断下read[colindex]。。。通过IDatareader的IsDbnull或Convert的ISDbnull判断是否为dbnuill类型,是就转化为默认值
不太明白你遇到了什么问题,我有一段赋值的代码片断,或许有你想要的东西:
if (toMappingName.ToUpper() == fromMappingName.ToUpper()) { if (toProperty.GetSetMethod() != null) { var fromValue = fromProperty.GetValue(fromEntity, null); if (fromValue == null) toProperty.SetValue(toEntity, null, null); else toProperty.SetValue(toEntity, fromValue, null); break; } }
@沧海一杰:
仔细看了一遍,你好像是反射读字段的出问题了,上面有一句代码:
fromProperty.GetValue(fromEntity, null);
不知道有没有用?