DataSet和List<T> 泛型之间互相转换 (转载, 作者写的很好)
http://www.cnblogs.com/envelope/archive/2010/04/20/1716343.html
002 |
//利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值。 |
003 |
//注意:从DataSet到IList<T>的转换,自定义类型的公开属性必须与DataTable中的字段名称 |
004 |
//一致,才能到达想要的结果。建议DataTable的定义从数据库来,自定义类型用O/R Mapping的方式获得。 |
005 |
006 |
//代码说明 |
007 |
008 |
009 |
010 |
/// <summary> |
011 |
/// 泛型集合与DataSet互相转换 |
012 |
/// </summary> |
013 |
using System.Data; |
014 |
using System.Reflection; |
015 |
using System.Collections; |
016 |
using System.Collections.Generic; |
017 |
using System; |
018 |
public class IListDataSet |
019 |
{ |
020 |
021 |
/// <summary> |
022 |
/// 集合装换DataSet |
023 |
/// </summary> |
024 |
/// <param name="list">集合</param> |
025 |
/// <returns></returns> |
026 |
/// 2008-08-01 22:08 HPDV2806 |
027 |
public static DataSet ToDataSet(IList p_List) |
028 |
{ |
029 |
DataSet result = new DataSet(); |
030 |
DataTable _DataTable = new DataTable(); |
031 |
if (p_List.Count > 0) |
032 |
{ |
033 |
PropertyInfo[] propertys = p_List[0].GetType().GetProperties(); |
034 |
foreach (PropertyInfo pi in propertys) |
035 |
{ |
036 |
_DataTable.Columns.Add(pi.Name, pi.PropertyType); |
037 |
} |
038 |
039 |
for ( int i = 0; i < p_List.Count; i++) |
040 |
{ |
041 |
ArrayList tempList = new ArrayList(); |
042 |
foreach (PropertyInfo pi in propertys) |
043 |
{ |
044 |
object obj = pi.GetValue(p_List[i], null ); |
045 |
tempList.Add(obj); |
046 |
} |
047 |
object [] array = tempList.ToArray(); |
048 |
_DataTable.LoadDataRow(array, true ); |
049 |
} |
050 |
} |
051 |
result.Tables.Add(_DataTable); |
052 |
return result; |
053 |
} |
054 |
055 |
/// <summary> |
056 |
/// 泛型集合转换DataSet |
057 |
/// </summary> |
058 |
/// <typeparam name="T"></typeparam> |
059 |
/// <param name="list">泛型集合</param> |
060 |
/// <returns></returns> |
061 |
/// 2008-08-01 22:43 HPDV2806 |
062 |
public static DataSet ToDataSet<T>(IList<T> list) |
063 |
{ |
064 |
return ToDataSet<T>(list, null ); |
065 |
} |
066 |
067 |
068 |
/// <summary> |
069 |
/// 泛型集合转换DataSet |
070 |
/// </summary> |
071 |
/// <typeparam name="T"></typeparam> |
072 |
/// <param name="p_List">泛型集合</param> |
073 |
/// <param name="p_PropertyName">待转换属性名数组</param> |
074 |
/// <returns></returns> |
075 |
/// 2008-08-01 22:44 HPDV2806 |
076 |
public static DataSet ToDataSet<T>(IList<T> p_List, params string [] p_PropertyName) |
077 |
{ |
078 |
List< string > propertyNameList = new List< string >(); |
079 |
if (p_PropertyName != null ) |
080 |
propertyNameList.AddRange(p_PropertyName); |
081 |
082 |
DataSet result = new DataSet(); |
083 |
DataTable _DataTable = new DataTable(); |
084 |
if (p_List.Count > 0) |
085 |
{ |
086 |
PropertyInfo[] propertys = p_List[0].GetType().GetProperties(); |
087 |
foreach (PropertyInfo pi in propertys) |
088 |
{ |
089 |
if (propertyNameList.Count == 0) |
090 |
{ |
091 |
// 没有指定属性的情况下全部属性都要转换 |
092 |
_DataTable.Columns.Add(pi.Name, pi.PropertyType); |
093 |
} |
094 |
else |
095 |
{ |
096 |
if (propertyNameList.Contains(pi.Name)) |
097 |
_DataTable.Columns.Add(pi.Name, pi.PropertyType); |
098 |
} |
099 |
} |
100 |
101 |
for ( int i = 0; i < p_List.Count; i++) |
102 |
{ |
103 |
ArrayList tempList = new ArrayList(); |
104 |
foreach (PropertyInfo pi in propertys) |
105 |
{ |
106 |
if (propertyNameList.Count == 0) |
107 |
{ |
108 |
object obj = pi.GetValue(p_List[i], null ); |
109 |
tempList.Add(obj); |
110 |
} |
111 |
else |
112 |
{ |
113 |
if (propertyNameList.Contains(pi.Name)) |
114 |
{ |
115 |
object obj = pi.GetValue(p_List[i], null ); |
116 |
tempList.Add(obj); |
117 |
} |
118 |
} |
119 |
} |
120 |
object [] array = tempList.ToArray(); |
121 |
_DataTable.LoadDataRow(array, true ); |
122 |
} |
123 |
} |
124 |
result.Tables.Add(_DataTable); |
125 |
return result; |
126 |
} |
127 |
128 |
/// <summary> |
129 |
/// DataSet装换为泛型集合 |
130 |
/// </summary> |
131 |
/// <typeparam name="T"></typeparam> |
132 |
/// <param name="p_DataSet">DataSet</param> |
133 |
/// <param name="p_TableIndex">待转换数据表索引</param> |
134 |
/// <returns></returns> |
135 |
/// 2008-08-01 22:46 HPDV2806 |
136 |
public static IList<T> DataSetToIList<T>(DataSet p_DataSet, int p_TableIndex) |
137 |
{ |
138 |
if (p_DataSet == null || p_DataSet.Tables.Count < 0) |
139 |
return null ; |
140 |
if (p_TableIndex > p_DataSet.Tables.Count - 1) |
141 |
return null ; |
142 |
if (p_TableIndex < 0) |
143 |
p_TableIndex = 0; |
144 |
145 |
DataTable p_Data = p_DataSet.Tables[p_TableIndex]; |
146 |
// 返回值初始化 |
147 |
IList<T> result = new List<T>(); |
148 |
for ( int j = 0; j < p_Data.Rows.Count; j++) |
149 |
{ |
150 |
T _t = (T)Activator.CreateInstance( typeof (T)); |
151 |
PropertyInfo[] propertys = _t.GetType().GetProperties(); |
152 |
foreach (PropertyInfo pi in propertys) |
153 |
{ |
154 |
for ( int i = 0; i < p_Data.Columns.Count; i++) |
155 |
{ |
156 |
// 属性与字段名称一致的进行赋值 |
157 |
if (pi.Name.Equals(p_Data.Columns[i].ColumnName)) |
158 |
{ |
159 |
// 数据库NULL值单独处理 |
160 |
if (p_Data.Rows[j][i] != DBNull.Value) |
161 |
pi.SetValue(_t, p_Data.Rows[j][i], null ); |
162 |
else |
163 |
pi.SetValue(_t, null , null ); |
164 |
break ; |
165 |
} |
166 |
} |
167 |
} |
168 |
result.Add(_t); |
169 |
} |
170 |
return result; |
171 |
} |
172 |
173 |
/// <summary> |
174 |
/// DataSet装换为泛型集合 |
175 |
/// </summary> |
176 |
/// <typeparam name="T"></typeparam> |
177 |
/// <param name="p_DataSet">DataSet</param> |
178 |
/// <param name="p_TableName">待转换数据表名称</param> |
179 |
/// <returns></returns> |
180 |
/// 2008-08-01 22:47 HPDV2806 |
181 |
public static IList<T> DataSetToIList<T>(DataSet p_DataSet, string p_TableName) |
182 |
{ |
183 |
int _TableIndex = 0; |
184 |
if (p_DataSet == null || p_DataSet.Tables.Count < 0) |
185 |
return null ; |
186 |
if ( string .IsNullOrEmpty(p_TableName)) |
187 |
return null ; |
188 |
for ( int i = 0; i < p_DataSet.Tables.Count; i++) |
189 |
{ |
190 |
// 获取Table名称在Tables集合中的索引值 |
191 |
if (p_DataSet.Tables[i].TableName.Equals(p_TableName)) |
192 |
{ |
193 |
_TableIndex = i; |
194 |
break ; |
195 |
} |
196 |
} |
197 |
return DataSetToIList<T>(p_DataSet, _TableIndex); |
198 |
} |
199 |
} |
200 |
201 |
202 |
/***************** |
203 |
使用范围 |
204 |
205 |
1. 可以用在业务层中数据获取,获取DataSet的同时也可以转为IList集合为调用者所使用。 |
206 |
207 |
2. 在WebServices中传输自定义类型使用,即传递参数都用DataSet类型(WebServices直接支持的数据类型),在使用前将其转换为IList来使用。 |
208 |
* ******************************/ |