/// <summary> /// 将集合转换为数据集。 /// </summary> /// <param name="list">集合。</param> /// <param name="t">转换的元素类型。</param> /// <param name="generic">是否生成泛型数据集。</param> /// <returns>转换后的数据集。</returns> private static DataSet ListToDataSet(IEnumerable list, Type t, bool generic) { DataSet ds = new DataSet("Data"); if (t == null) { if (list != null) { foreach (var i in list) { if (i == null) { continue; } t = i.GetType(); break; } } if (t == null) { return(ds); } } ds.Tables.Add(t.Name); //如果集合中元素为DataSet扩展涉及到的基本类型时,进行特殊转换。 if (t.IsValueType || t == typeof(string)) { ds.Tables[0].TableName = "Info"; ds.Tables[0].Columns.Add(t.Name); if (list != null) { foreach (var i in list) { DataRow addRow = ds.Tables[0].NewRow(); addRow[t.Name] = i; ds.Tables[0].Rows.Add(addRow); } } return(ds); } //处理模型的字段和属性。 var fields = t.GetFields(); var properties = t.GetProperties(); foreach (var j in fields) { if (!ds.Tables[0].Columns.Contains(j.Name)) { if (generic) { ds.Tables[0].Columns.Add(j.Name, j.FieldType); } else { ds.Tables[0].Columns.Add(j.Name); } } } foreach (var j in properties) { if (!ds.Tables[0].Columns.Contains(j.Name)) { if (generic) { ds.Tables[0].Columns.Add(j.Name, j.PropertyType); } else { ds.Tables[0].Columns.Add(j.Name); } } } if (list == null) { return(ds); } //读取list中元素的值。 foreach (var i in list) { if (i == null) { continue; } DataRow addRow = ds.Tables[0].NewRow(); foreach (var j in fields) { MemberExpression field = Expression.Field(Expression.Constant(i), j.Name); LambdaExpression lambda = Expression.Lambda(field, new ParameterExpression[] { }); Delegate func = lambda.Compile(); object value = func.DynamicInvoke(); addRow[j.Name] = value; } foreach (var j in properties) { MemberExpression property = Expression.Property(Expression.Constant(i), j); LambdaExpression lambda = Expression.Lambda(property, new ParameterExpression[] { }); Delegate func = lambda.Compile(); object value = func.DynamicInvoke(); addRow[j.Name] = value; } ds.Tables[0].Rows.Add(addRow); } return(ds); }