首页 新闻 会员 周边 捐助

关于C#中反射的GetSetMethod().Invoke方法

0
悬赏园豆:10 [待解决问题]

小弟今天写了一个方法,使用反射来查询数据。在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;
        }
something的主页 something | 初学一级 | 园豆:5
提问于:2013-07-19 14:31
< >
分享
所有回答(2)
0

为什么不分别调用GetValue和SetValue方法,而要Invoke呢?

空明流光 | 园豆:111 (初学一级) | 2013-07-19 14:37
0

对数据库中取出的数据判断下read[colindex]。。。通过IDatareader的IsDbnull或Convert的ISDbnull判断是否为dbnuill类型,是就转化为默认值

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-07-19 15:50

不太明白你遇到了什么问题,我有一段赋值的代码片断,或许有你想要的东西:

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;
                        }
                    }
支持(0) 反对(0) 空明流光 | 园豆:111 (初学一级) | 2013-07-19 15:58

@沧海一杰: 

仔细看了一遍,你好像是反射读字段的出问题了,上面有一句代码:

fromProperty.GetValue(fromEntity, null);

不知道有没有用?

支持(0) 反对(0) 空明流光 | 园豆:111 (初学一级) | 2013-07-19 16:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册