public byte GetByte(int i) => (byte)GetValue(i); public string GetName(int i) => ModelToDataTable<TModel>.Columns[i].ColumnName; public string GetDataTypeName(int i) => ModelToDataTable<TModel>.Columns[i].DataType.Name; public Type GetFieldType(int i) => ModelToDataTable<TModel>.Columns[i].DataType; public object GetValue(int i) => _currentDataRow[i]; public bool GetBoolean(int i) => (bool)GetValue(i); public char GetChar(int i) => (char)GetValue(i); public Guid GetGuid(int i) => (Guid)GetValue(i); public short GetInt16(int i) => (short)GetValue(i); public int GetInt32(int i) => (int)GetValue(i); public long GetInt64(int i) => (long)GetValue(i); public float GetFloat(int i) => (float)GetValue(i); public double GetDouble(int i) => (double)GetValue(i); public string GetString(int i) => (string)GetValue(i); public decimal GetDecimal(int i) => (decimal)GetValue(i); public DateTime GetDateTime(int i) => (DateTime)GetValue(i); public IDataReader GetData(int i) => throw new NotSupportedException(); public int FieldCount => ModelToDataTable<TModel>.Columns.Count; public object this[int i] => GetValue(i); public object this[string name] => GetValue(GetOrdinal(name)); public void Close() => Dispose(); public DataTable GetSchemaTable() => ModelToDataTable<TModel>.ToDataTable(_source); public bool Read() => NextResult(); public int Depth => _depth; public bool IsClosed => _release; public int RecordsAffected => 0; }
模型对象转数据行工具类
/// <summary> /// 对象转换成DataTable转换类 /// </summary> /// <typeparam>泛型类型</typeparam> public static class ModelToDataTable<TModel> { static ModelToDataTable() { //如果需要剔除某些列可以修改这段代码 var propertyList = typeof(TModel).GetProperties().Where(w => w.CanRead).ToArray(); Columns = new ReadOnlyCollection<DataColumn>(propertyList .Select(pr => new DataColumn(pr.Name, GetDataType(pr.PropertyType))).ToArray()); //生成对象转数据行委托 ToRowData = BuildToRowDataDelegation(typeof(TModel), propertyList); }
/// <summary> /// 构建转换成数据行委托 /// </summary> /// <param>传入类型</param> /// <param>转换的属性</param> /// <returns>转换数据行委托</returns> private static Func<TModel, object[]> BuildToRowDataDelegation(Type type, PropertyInfo[] propertyList) { var source = Expression.Parameter(type); var items = propertyList.Select(property => ConvertBindPropertyToData(source, property)); var array = Expression.NewArrayInit(typeof(object), items); var lambda = Expression.Lambda<Func<TModel, object[]>>(array, source); return lambda.Compile(); }
/// <summary> /// 将属性转换成数据 /// </summary> /// <param>源变量</param> /// <param>属性信息</param> /// <returns>获取属性数据表达式</returns> private static Expression ConvertBindPropertyToData(ParameterExpression source, PropertyInfo property) { var propertyType = property.PropertyType; var expression = (Expression)Expression.Property(source, property); if (propertyType.IsEnum) expression = Expression.Convert(expression, propertyType.GetEnumUnderlyingType()); return Expression.Convert(expression, typeof(object)); }
/// <summary> /// 获取数据类型 /// </summary> /// <param>属性类型</param> /// <returns>数据类型</returns> private static Type GetDataType(Type type) { //枚举默认转换成对应的值类型 if (type.IsEnum) return type.GetEnumUnderlyingType(); //可空类型 if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) return GetDataType(type.GetGenericArguments().First()); return type; }
/// <summary> /// 列集合 /// </summary> public static IReadOnlyList<DataColumn> Columns { get; }
/// <summary> /// 对象转数据行委托 /// </summary> public static Func<TModel, object[]> ToRowData { get; }
(编辑:焦作站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|