Преобразование DataTable в общий список?

public static IList ConvertTo(DataTable table) { if (table == null) { return null; } List rows = new List(); foreach (DataRow row in table.Rows) { rows.Add(row); } return ConvertTo(rows); } public static T ConvertItem(DataTable table) { T obj = default(T); if (table != null && table.Rows.Count > 0) { obj = CreateItem(table.Rows[0]); } return obj; } public static T CreateItem(DataRow row) { T obj = default(T); if (row != null) { obj = Activator.CreateInstance(); Type entityType = typeof(T); PropertyInfo[] properties = entityType.GetProperties(); for (int i = 0; i  0 && null != (dataField = customAttributes[0] as ColumnAttributes)) { if (row.Table.Columns.Contains(dataField.FieldName) && !row[dataField.FieldName].GetType().FullName.Equals("System.DBNull")) { properties[i].SetValue(obj, row[dataField.FieldName], null); } } } } return obj; } 

Это единственное, о чем мы сейчас можем думать, это то, что мы должны делать что-то, где нам нужно, чтобы Мусор собирал себя?

Мысли?

Почему мы думаем, что может быть утечка?

Мы получаем ошибки из памяти. Если на странице не требуется, чтобы бизнес-логика использовала этот тип преобразования, процесс II6 не растет, но когда мы попадаем на страницу, которая его использует, она растет.

В настоящее время мы получаем ANTS Profiler, чтобы предоставить нам более подробную информацию.

Это не будет настоящей утечкой , но это может быть лишним лишним …

Сколько строк вы работаете? Обратите внимание, что рефлексия – это боль, и каждый вызов таких вещей, как 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; } 
  • Java Generic Class - определение типа
  • Неопределенный контейнер для хранения типично типизированных объектов в Java
  • Почему T ограничено объектом в подписи Collections.max ()?
  • Ссылка неоднозначна с дженериками
  • Потенциальное загрязнение кучи по параметру varargs
  • Внедрить общий макрос свопинга в C
  • Кастинг для общего типа в Java не вызывает ClassCastException?
  • Как создать общий массив?
  • Можете ли вы использовать «где», чтобы требовать атрибут в c #?
  • Решение для перегруженного ограничения оператора в .NET-дженериках
  • Как установить форвардную декларацию с помощью общих типов в Delphi 2010?
  • Давайте будем гением компьютера.