///<summary> ///从载入实时运行数据, 适用于批量处理载入。 ///1. 使用rundataSelectAll获取DataTable ///2. 调用程序应根据dr中的id字段(rundataTableRelation.mainTable.keyFieldName指明了id字段名)查找对象obj ///3. 调用本方法填充运行数据 ///</summary> void loadRundata(DataRow dr, PowerBasicObject obj, DataLayer.EReadMode readmode, bool isRealRun) { if (obj.busiRunData == null) { obj.busiRunData = createRundata(obj); } else if (obj.busiRunData.GetType().FullName != rundataTypeFullName) { System.Windows.MessageBox.Show("已有运行数据类型与描述不一致, 强制使用描述类型。" + key); obj.busiRunData = createRundata(obj); } foreach (DataColumn item in dr.Table.Columns) { PropertyDesc pd; if (readmode == DataLayer.EReadMode.数据库读取) { pd = (isRealRun ? rundatadesces : planningdesces).FirstOrDefault(p => p.fieldname != null && p.fieldname.ToLower() == item.ColumnName.ToLower()); } else { pd = (isRealRun ? rundatadesces : planningdesces).FirstOrDefault(p => p.simFieldName != null && p.simFieldName.ToLower() == item.ColumnName.ToLower()); } if (pd != null) { setPropertyValue(obj.busiRunData, dr, pd, readmode); } } }
///<summary>设置属性值</summary> void setPropertyValue(object obj, DataRow dr, PropertyDesc pd, DataLayer.EReadMode readmode) { //反射设置属性值 PropertyInfo pi = obj.GetType().GetProperty(pd.propertyname); string fieldtypename = readmode == DataLayer.EReadMode.模拟 ? pd.simtypename : pd.fieldtypename; string fieldname = readmode == DataLayer.EReadMode.模拟 ? pd.simFieldName : pd.fieldname; switch (pd.propertyTypeName) { case "Float": pi.SetValue(obj, getValueFromDB <float>(dr, fieldtypename, fieldname), null); break; case "Double": pi.SetValue(obj, getValueFromDB <double>(dr, fieldtypename, fieldname), null); break; case "Int32": pi.SetValue(obj, getValueFromDB <int>(dr, fieldtypename, fieldname), null); break; case "String": pi.SetValue(obj, getValueFromDB <string>(dr, fieldtypename, fieldname), null); break; case "Boolean": pi.SetValue(obj, getValueFromDB <bool>(dr, fieldtypename, fieldname), null); break; case "DateTime": pi.SetValue(obj, getValueFromDB <DateTime>(dr, fieldtypename, fieldname), null); break; default: //zh注:枚举的处理,还要检查 pi.SetValue(obj, getValueFromDB <int>(dr, fieldtypename, fieldname), null); break; } }