#region DataSet数据读取protected delegate P GetDataSetItemHandler<P>(DataRow row);internal static T GetItem(DataRow dr){T item = new T();DataTableAttribute tableAttribute = DataEntity.GetTableAttribute<T>();if (tableAttribute != null){for (int i = 0; i < dr.Table.Columns.Count; i++){string columnName = dr.Table.Columns[i].ColumnName;if (dr.IsNull(i) == true || tableAttribute.DataColumnDict.Keys.Contains(columnName) == false)continue;DataColumnAttribute columnAttribute = tableAttribute.DataColumnDict[columnName];object value = dr[i];var setterMethod = columnAttribute.GetEmitSetter<T>();setterMethod(item, value);}}return item;}/// <summary>/// 获取数据读取的列表/// </summary>protected List<P> GetDataSetList<P>(string sql, IDataParameter[] parameters, GetDataSetItemHandler<P> getItem){List<P> list = null;DataSet ds = null;if (parameters != null)ds = DBUtility.DBHelperSQL.ExecuteDataSet(sql, parameters);elseds = DBUtility.DBHelperSQL.ExecuteDataSet(sql);if (ds != null && ds.Tables.Count > 0){DataTable dt = ds.Tables[0];list = new List<P>(dt.Rows.Count);foreach (DataRow row in dt.Rows){P p = getItem(row);if (p != null)list.Add(p);}dt.Dispose();ds.Dispose();}return list;}/// <summary>/// 获取数据读取的分页列表/// </summary>protected List<P> GetDataSetPageList<P>(string sql, IDataParameter[] parameters, GetDataSetItemHandler<P> getItem,int pageIndex,int pageSize, out int recordCount){//分页SQL//sql = RebuildPageSql(sql, pageIndex, pageSize, ref parameters); recordCount = 0;int endIndex = pageIndex * pageSize;int startIndex = endIndex - pageSize + 1;List<P> list = null;DataSet ds = null;if (parameters != null)ds = DBUtility.DBHelperSQL.ExecuteDataSet(sql, parameters);elseds = DBUtility.DBHelperSQL.ExecuteDataSet(sql);if (ds != null && ds.Tables.Count > 0){DataTable dataTable = ds.Tables[0];//DataTable recordCountTable = ds.Tables[1];list = new List<P>(dataTable.Rows.Count);foreach (DataRow row in dataTable.Rows){recordCount++;if (startIndex <= recordCount && recordCount <= endIndex){P p = getItem(row);if (p != null)list.Add(p);}}//if (recordCountTable.Rows.Count > 0)// recordCount = (int)recordCountTable.Rows[0]["record_count"];//recordCountTable.Dispose(); dataTable.Dispose();ds.Dispose();}return list;}/// <summary>/// 获取存储过程数据读取的列表/// </summary>protected List<P> GetDataSetProcedureList<P>(string storedProcName, IDataParameter[] parameters, GetDataSetItemHandler<P> getItem){List<P> list = null;DataSet ds = DBUtility.DBHelperSQL.ExecuteDataSetProcedure(storedProcName, parameters);if (ds != null && ds.Tables.Count > 0){DataTable dt = ds.Tables[0];list = new List<P>(dt.Rows.Count);foreach (DataRow row in dt.Rows){P p = getItem(row);if (p != null)list.Add(p);}dt.Dispose();ds.Dispose();}return list;}/// <summary>/// 获取数据读取的单项信息/// </summary>protected P GetDataSetItem<P>(string sql, IDataParameter[] parameters, GetDataSetItemHandler<P> getItem){P item = default(P);DataSet ds = null;if (parameters != null)ds = DBUtility.DBHelperSQL.ExecuteDataSet(sql, parameters);elseds = DBUtility.DBHelperSQL.ExecuteDataSet(sql);if (ds != null && ds.Tables.Count > 0){DataTable dt = ds.Tables[0];foreach (DataRow row in dt.Rows){item = getItem(row);break;}dt.Dispose();ds.Dispose();}return item;}/// <summary>/// 获取数据读取的单项信息/// </summary>protected P GetDataSetProcedureItem<P>(string storedProcName, IDataParameter[] parameters, GetDataSetItemHandler<P> getItem){P item = default(P);DataSet ds = DBUtility.DBHelperSQL.ExecuteDataSetProcedure(storedProcName, parameters);if (ds != null && ds.Tables.Count > 0){DataTable dt = ds.Tables[0];foreach (DataRow row in dt.Rows){item = getItem(row);break;}dt.Dispose();ds.Dispose();}return item;}#endregion
ColumnAttribute
public class DataColumnAttribute : Attribute{private string column_name;private System.Data.DbType column_type = DbType.String;private int length = 0;private bool identity_id;private bool ignore;private string description;private string property_name;public DataColumnAttribute(){}public DataColumnAttribute(string columnName){this.column_name = columnName;}public string ColumnName{get { return column_name; }set { column_name = value; }}public DbType ColumnType{get { return column_type; }set{column_type = value;if (length == 0){if (column_type == DbType.Decimal){length = 22;}else if (column_type == DbType.String){length = 32;}elselength = 0;}}}public bool IdentityID{get { return identity_id; }set {identity_id = value;if (identity_id){column_type = DbType.Decimal;length = 22;}}}public string Description{get { return description; }set { description = value; }}public bool Ignore{get { return ignore; }set { ignore = value; }}public int Length{get { return length; }set { length = value; }}public string PropertyName{get { return property_name; }set { property_name = value; }}private object emit_setter = null;public void SetEmitSetter<T>(Action<T, object> action){emit_setter = action;}public Action<T, object> GetEmitSetter<T>(){return emit_setter as Action<T, object>;}}
DataTableAttribute
public class DataTableAttribute : Attribute{private string table_name;private string identityid_name;private string description;private IDictionary<string, DataColumnAttribute> dataColumnDict;public DataTableAttribute(){this.dataColumnDict = new Dictionary<string, DataColumnAttribute>(50);}public DataTableAttribute(string tableName) : this(){this.table_name = tableName;}public string TableName{get { return table_name; }set { table_name = value; }}public string IdentityIDName{get { return identityid_name; }set { identityid_name = value; }}public string Description{get { return description; }set { description = value; }}public IDictionary<string, DataColumnAttribute> DataColumnDict{get { return dataColumnDict; }set { dataColumnDict = value; }}}
public class DataEntity{static readonly object padlock = new object();private static Dictionary<string, DataTableAttribute> table_dict = new Dictionary<string, DataTableAttribute>(100);public static DataTableAttribute GetTableAttribute<T>(){DataTableAttribute table_attribute = null;string class_name = typeof(T).ToString();if (table_dict.ContainsKey(class_name)){table_attribute = table_dict[class_name];}if (table_attribute == null){lock (padlock){if (table_attribute == null){//通过反射获取数据表特性object[] attributes = typeof(T).GetCustomAttributes(typeof(DataTableAttribute), false);if (attributes != null && attributes.Length > 0){table_attribute = (DataTableAttribute)attributes[0];//通过反射获取数据列特性PropertyInfo[] properties = typeof(T).GetProperties();foreach (PropertyInfo propertie in properties){object[] pro_attributes = propertie.GetCustomAttributes(typeof(DataColumnAttribute), true);if (pro_attributes != null && pro_attributes.Length > 0){DataColumnAttribute column_attribute = (DataColumnAttribute)pro_attributes[0];//默认的唯一IDif (column_attribute.IdentityID == true){table_attribute.IdentityIDName = column_attribute.ColumnName;}column_attribute.PropertyName = propertie.Name;column_attribute.SetEmitSetter(EmitSetter<T>(propertie.Name));#region 列数据类型if (column_attribute.ColumnType != DbType.AnsiString){if (propertie.PropertyType == typeof(decimal)){column_attribute.ColumnType = DbType.Decimal;}else if (propertie.PropertyType == typeof(short)){column_attribute.ColumnType = DbType.Int16;}else if (propertie.PropertyType == typeof(int)){column_attribute.ColumnType = DbType.Int32;}else if (propertie.PropertyType == typeof(long)){column_attribute.ColumnType = DbType.Int64;}else if (propertie.PropertyType == typeof(bool)){column_attribute.ColumnType = DbType.Boolean;}else if (propertie.PropertyType == typeof(DateTime) || propertie.PropertyType == typeof(DateTime?)){column_attribute.ColumnType = DbType.DateTime;}else if (propertie.PropertyType == typeof(double) || propertie.PropertyType == typeof(float)){column_attribute.ColumnType = DbType.Double;}else{column_attribute.ColumnType = DbType.String;}}#endregiontable_attribute.DataColumnDict.Add(column_attribute.ColumnName, column_attribute);}}if (table_dict.ContainsKey(class_name))table_dict[class_name] = table_attribute;elsetable_dict.Add(class_name, table_attribute);}}}}return table_attribute;}/// <summary>/// 反射获取对象的属性值/// </summary>/// <param name="obj"></param>/// <param name="propertyName"></param>/// <returns></returns>public static object ReflectGetter(object obj, string propertyName){var type = obj.GetType();PropertyInfo propertyInfo = type.GetProperty(propertyName);var propertyValue = propertyInfo.GetValue(obj, null);return propertyValue;}public static DataColumnAttribute ExpresionGetter<T>(Expression<Func<T, object>> expr){DataColumnAttribute column_attribute = null;object[] attributes = null;if (expr.Body is UnaryExpression){attributes = ((MemberExpression)((UnaryExpression)expr.Body).Operand).Member.GetCustomAttributes(typeof(DataColumnAttribute), true);}else if (expr.Body is MemberExpression){attributes = ((MemberExpression)expr.Body).Member.GetCustomAttributes(typeof(DataColumnAttribute), true);}else if (expr.Body is ParameterExpression){attributes = ((ParameterExpression)expr.Body).Type.GetCustomAttributes(typeof(DataColumnAttribute), true);}if (attributes != null && attributes.Length > 0){string column_name = (attributes[0] as DataColumnAttribute).ColumnName;if (column_name == "module_content"){}DataTableAttribute TableAttribute = DataEntity.GetTableAttribute<T>();if (TableAttribute != null && TableAttribute.DataColumnDict.ContainsKey(column_name))column_attribute = TableAttribute.DataColumnDict[column_name];}return column_attribute;}/// <summary>/// 表达式设置对象的属性值/// </summary>/// <typeparam name="T"></typeparam>/// <param name="propertyName"></param>/// <returns></returns>public static Action<T, object> ExpresionSetter<T>(string propertyName){var type = typeof(T);var property = type.GetProperty(propertyName);var objectParameterExpression = Expression.Parameter(typeof(object), "obj");var objectUnaryExpression = Expression.Convert(objectParameterExpression, type);var valueParameterExpression = Expression.Parameter(typeof(object), "val");var valueUnaryExpression = Expression.Convert(valueParameterExpression, property.PropertyType);//// 调用给属性赋值的方法var body = Expression.Call(objectUnaryExpression, property.GetSetMethod(), valueUnaryExpression);var expression = Expression.Lambda<Action<T, object>>(body, objectParameterExpression, valueParameterExpression);return expression.Compile();}/// <summary>/// 反射设置对象的属性值/// </summary>/// <param name="obj"></param>/// <param name="propertyName"></param>/// <param name="propertyValue"></param>public static void ReflectSetter(object obj, string propertyName, object propertyValue){var type = obj.GetType();var propertyInfo = type.GetProperty(propertyName);propertyInfo.SetValue(obj, propertyValue, null);}/// <summary>/// Emit设置对象的属性值/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public static Action<T, object> EmitSetter<T>(string propertyName){var type = typeof(T);var dynamicMethod = new DynamicMethod("EmitCallable", null, new[] { type, typeof(object) }, type.Module);var iLGenerator = dynamicMethod.GetILGenerator();var callMethod = type.GetMethod("set_" + propertyName, BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Public);var parameterInfo = callMethod.GetParameters()[0];var local = iLGenerator.DeclareLocal(parameterInfo.ParameterType, true);iLGenerator.Emit(OpCodes.Ldarg_1);if (parameterInfo.ParameterType.IsValueType){// 如果是值类型,拆箱 iLGenerator.Emit(OpCodes.Unbox_Any, parameterInfo.ParameterType);}else{// 如果是引用类型,转换 iLGenerator.Emit(OpCodes.Castclass, parameterInfo.ParameterType);}iLGenerator.Emit(OpCodes.Stloc, local);iLGenerator.Emit(OpCodes.Ldarg_0);iLGenerator.Emit(OpCodes.Ldloc, local);iLGenerator.EmitCall(OpCodes.Callvirt, callMethod, null);iLGenerator.Emit(OpCodes.Ret);return dynamicMethod.CreateDelegate(typeof(Action<T, object>)) as Action<T, object>;}}