首页 > 代码库 > 2016.5.23 用反射技术为实体类变量赋值、取值

2016.5.23 用反射技术为实体类变量赋值、取值

clobj是任意一个数据库表对应的实体类空白实例 TERMINAL_PRO clobj= new TERMINAL_PRO();

 

            DataRow row = dtt.Rows[0];

            Type t = clobj.GetType();

            foreach (PropertyInfo pi in t.GetProperties()) //不用考虑属性的类型

            {

                string name = pi.Name; //获得此属性名称

 

                if (dtt.Columns.Contains(name))

                {

                    object ob = row[name];

                    pi.SetValue(clobj, ob.IsEmptyOrNull() ? null : Convert.ChangeType(ob, pi.PropertyType), null);

                }

            }

至此clobj赋值完成,各种类型的变量根据DataRow类型完成赋值

pi.SetValue(pro,value,null) 将value赋值给pro实例的pi对应属性,value和pi类型必须统一,所以1要判断是否null,2要进行类型转换Convert.ChangeType(ob, pi.PropertyType)

 

//简化insert into 及反射赋值技术

string sql_insert = string.Format("insert into {0}.{1} ( ", AisLogical.dbuser, "TERMINAL_PRO_DOUBLE");

string sql_value = http://www.mamicode.com/string.Format("values ( ");

 

            Type t = pro.GetType();

            foreach (PropertyInfo pi in t.GetProperties())

            {

                string name = pi.Name; //获得此属性名称

                object value = http://www.mamicode.com/pi.GetValue(pro, null);//获得此属性值

 

                sql_insert += name + ", ";

                if (pi.PropertyType == typeof(string)) //属性的类型判断  

                {

                    sql_value += string.Format(" ‘{0}‘, ", value);

                }

                else

                    sql_value += value+",";

 

            }

 

pi.GetValue(pro, null); 获取pro对象对应pi属性的值。

 

此外,函数调用中的ref关键字只对简单变量有效,如果是实例作为参数,即使不加ref,调用结束后此实例仍然保留了函数中的赋值过程。原理是,如果不用ref修饰参数变量,调用函数就复制此参数进入函数调用。但对实例参数,这种拷贝是浅拷贝,所以跟带了ref前缀效果一样。

2016.5.23 用反射技术为实体类变量赋值、取值