C#讀取對象實例的值和對對象的屬性自動賦值方法



using
System; using System.Data; using System.Reflection; namespace DBUtility { /// <summary> /// 對象實例操作輔助類 /// </summary> public static class InstanceHelper { /// <summary> /// 根據對象的屬性名稱,獲取屬性的值(用於根據對象自動完成參數化sql語句的賦值操作) /// </summary> /// <param name="propertyName">屬性名稱(忽略大小寫)</param> /// <param name="objectInstance">對象實例</param> /// <param name="objectType">對象實例類型</param> /// <returns>屬性的值</returns> public static object GetPropertyValue(string propertyName, object objectInstance, Type objectType) { PropertyInfo pi = objectType.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); if (pi == null) throw new ArgumentException("自動設置參數值失敗。參數化變量名稱" + propertyName + "必須和對象中的屬性名稱一樣。"); if (!pi.CanRead) throw new ArgumentException("自動設置參數值失敗。對象的" + propertyName + "屬性沒有get方式,無法讀取值。"); object value = pi.GetValue(objectInstance, null); if (value == null) value = DBNull.Value; else if (pi.PropertyType.Name == "DateTime" && Convert.ToDateTime(value) == DateTime.MinValue) value = DBNull.Value;//防止數據庫是smalldatetime類型時DateTime.MinValue溢出 return value; } /// <summary> /// 將DataReader中的數據自動賦值到對象實例對應的屬性 /// 注意:對象實例的屬性名稱必須和數據庫列名相同,可忽略大小寫 /// </summary> /// <param name="dataReader">SqlDataReader等數據閱讀器獲取的一行數據</param> /// <param name="objectInstance">對象實例</param> /// <param name="objectType">對象實例類型</param> public static void SetPropertyValue(IDataReader dataReader, object objectInstance, Type objectType) { for (int i = 0; i < dataReader.FieldCount; i++) { PropertyInfo pi = objectType.GetProperty(dataReader.GetName(i), BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); if (pi != null && pi.CanWrite && dataReader[i] != DBNull.Value) { //如果是int?、bool?、double?等這種可空類型,獲取其實際類型,如int?的實際類型是int Type baseType = Nullable.GetUnderlyingType(pi.PropertyType); if (baseType != null) pi.SetValue(objectInstance, Convert.ChangeType(dataReader[i], baseType), null); else pi.SetValue(objectInstance, Convert.ChangeType(dataReader[i], pi.PropertyType), null);//設置對象值 } } } #region 用於Oracle數據庫操作 /// <summary> /// 根據對象的屬性名稱,獲取屬性的值(用於根據對象自動完成參數化sql語句的賦值操作) /// </summary> /// <param name="propertyName">屬性名稱(忽略大小寫)</param> /// <param name="objectInstance">對象實例</param> /// <param name="objectType">對象實例類型</param> /// <returns>屬性的值</returns> public static object GetPropertyValue2(string propertyName, object objectInstance, Type objectType) { PropertyInfo pi = objectType.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); if (pi == null) throw new ArgumentException("自動設置參數值失敗。參數化變量名稱必須和對象中的屬性名稱一樣。"); if (!pi.CanRead) throw new ArgumentException("自動設置參數值失敗。對象的" + propertyName + "屬性沒有get方式,無法讀取值。"); object value = pi.GetValue(objectInstance, null); if (value == null) value = DBNull.Value; else if (pi.PropertyType.Name == "DateTime" && Convert.ToDateTime(value) == DateTime.MinValue) value = DBNull.Value; else if (pi.PropertyType.Name == "Boolean")//oracle數據庫用char(1)作為bool類型 value = OraBit(Convert.ToBoolean(value)); return value; } /// <summary> /// 將DataReader中的數據自動賦值到對象實例對應的屬性 /// 注意:對象實例的屬性名稱必須和數據庫列名相同,可忽略大小寫 /// </summary> /// <param name="dataReader">OracleDataReader獲取的一行數據</param> /// <param name="objectInstance">對象實例</param> /// <param name="objectType">對象實例類型</param> public static void SetPropertyValue2(IDataReader dataReader, object objectInstance, Type objectType) { for (int i = 0; i < dataReader.FieldCount; i++) { PropertyInfo pi = objectType.GetProperty(dataReader.GetName(i), BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); if (pi != null && pi.CanWrite && dataReader[i] != DBNull.Value) { Type baseType = Nullable.GetUnderlyingType(pi.PropertyType);//獲取其實際類型,如int?的實際類型是int if (baseType != null)//如果是int?、bool?、double?等可空類型 { if (baseType.Name == "Boolean") pi.SetValue(objectInstance, OraBool(dataReader[i].ToString()), null); else pi.SetValue(objectInstance, Convert.ChangeType(dataReader[i], baseType), null); } else { if (pi.PropertyType.Name == "Boolean") pi.SetValue(objectInstance, OraBool(dataReader[i].ToString()), null); else pi.SetValue(objectInstance, Convert.ChangeType(dataReader[i], pi.PropertyType), null);//設置對象值 } } } } /// <summary> /// Converter to use boolean data type with Oracle /// </summary> /// <param name="value">Value to convert</param> /// <returns></returns> public static string OraBit(bool value) { if (value) return "Y"; else return "N"; } /// <summary> /// Converter to use boolean data type with Oracle /// </summary> /// <param name="value">Value to convert</param> /// <returns></returns> public static bool OraBool(string value) { if (value.Equals("Y")) return true; else return false; } #endregion } }

以上是通過反射對對象賦值,對對象賦值最高效方法是使用Emit,Emit對對象自動賦值如果加上緩存效率比手寫代碼效率更快。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM