这不会是一个实际的泄漏,但它可能会不必要地强调事情......
你工作了多少行?请注意,反射是一种痛苦,每次调用GetCustomAttributes
都会返回一个新数组(所以你想要这样做一次,而不是每行每个属性一次).
就个人而言,我预先构建了我打算做的工作......如下所示.
请注意,如果我这样做,我要么切换到HyperDescriptor,要么.NET 3.5是一个选项,可能是一个已编译的表达式.由于DataTable
不是强类型,HyperDescriptor
在下面之后将是合乎逻辑的下一步(针对性能)...
sealed class Tuple{ public Tuple() {} public Tuple(T1 value1, T2 value2) {Value1 = value1; Value2 = value2;} public T1 Value1 {get;set;} public T2 Value2 {get;set;} } public static List Convert (DataTable table) where T : class, new() { List > map = new List >(); foreach(PropertyInfo pi in typeof(T).GetProperties()) { ColumnAttribute col = (ColumnAttribute) Attribute.GetCustomAttribute(pi, typeof(ColumnAttribute)); if(col == null) continue; if(table.Columns.Contains(col.FieldName)) { map.Add(new Tuple ( table.Columns[col.FieldName], pi)); } } List list = new List (table.Rows.Count); foreach(DataRow row in table.Rows) { if(row == null) { list.Add(null); continue; } T item = new T(); foreach(Tuple pair in map) { object value = row[pair.Value1]; if(value is DBNull) value = null; pair.Value2.SetValue(item, value, null); } list.Add(item); } return list; }