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 = string.Format("values ( ");
Type t = pro.GetType();
foreach (PropertyInfo pi in t.GetProperties())
{
string name = pi.Name; //获得此属性名称
object value = 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前缀效果一样。