Member-515487 Ответов: 2

Как отрегулировать нуль-состоянии типа преобразовать DataTable для списка


Как отрегулировать нуль-состоянии типа преобразовать DataTable для списка

public static class DataTableToList
   {
       public static List<T> ToList<T>(this DataTable table) where T : class, new()
       {
           try
           {
               List<T> list = new List<T>();

               foreach (var row in table.AsEnumerable())
               {
                   T obj = new T();

                   foreach (var prop in obj.GetType().GetProperties())
                   {
                       try
                       {
                           PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name);
                           propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
                       }
                       catch
                       {
                           continue;
                       }
                   }

                   list.Add(obj);
               }

               return list;
           }
           catch
           {
               return null;
           }
       }
   }


Что я уже пробовал:

Как отрегулировать нуль-состоянии типа преобразовать DataTable для списка

Philippe Mori

continue это catch блок бесполезен...

2 Ответов

Рейтинг:
11

Karthik_Mahalingam

попробуйте этот код,
я использую это в течение длительного времени.

public static List<T> DataTableToList<T>(DataTable dt) where T : class, new()
{
    List<T> lstItems = new List<T>();
    if (dt != null && dt.Rows.Count > 0)
        foreach (DataRow row in dt.Rows)
            lstItems.Add(ConvertDataRowToGenericType<T>(row));
    else
        lstItems = null;
    return lstItems;
}

private static T ConvertDataRowToGenericType<T>(DataRow row) where T : class,new()
{
    Type entityType = typeof(T);
    T objEntity = new T();
    foreach (DataColumn column in row.Table.Columns)
    {
        object value = row[column.ColumnName];
        if (value == DBNull.Value) value = null;
        PropertyInfo property = entityType.GetProperty(column.ColumnName, BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Public);
        try
        {
            if (property != null && property.CanWrite)
                property.SetValue(objEntity, value, null);

        }
        catch (Exception ex)
        {
           throw ex;
        }
    }
    return objEntity;
}


Philippe Mori

Ловить исключение, чтобы переосмыслить его по значению, не имеет особого смысла. Это плохая практика кодирования.

Karthik_Mahalingam

согласен,

это был мой первоначальный код.

поймать (исключение бывший)
{
exceptionMessageInfo_Names строка = строка.Формат ("SQL Column Name:= {0} \n BusinessType Property Name:= {1}", column.ColumnName, property != null ? собственность.Имя: строка.Пустой);
exceptionMessageInfo_DataTypes строка = строка.Формат ("SQL Column Type:= {0} \n BusinessType Property Type:= {1}", column.Тип данных, свойство != null ? собственность.Тип свойства.Имя: строка.Пустой);
бросить новое исключение("сообщение об ошибке :=" + экс.Сообщение + Окружающая Среда.Перевод строки + exceptionMessageInfo_Names +
Среды.Перевод строки + exceptionMessageInfo_DataTypes);
}

Philippe Mori

Тогда почему бы не использовать конструктор с внутренним исключением: Конструктор Исключений (String, Exception)?

Рейтинг:
0

njammy

Все, что вам нужно сделать, это в существующем коде добавить строку, чтобы проверить, является ли значение строки данных нулевым, а также если свойство <T> также может быть обнулено:

if(row[prop.Name] == DBNull.Value /* or == null */
   && prop.PropertyType.IsValueType
   && Nullable.GetUnderlyingType(prop.PropertyType) != null)
   // if property is nullable, underlying nullable type will eval as true.
{
    propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
}