Преобразование данных в Generi c Список - PullRequest
2 голосов
/ 05 февраля 2020

Я хочу создать Generi c функцию , в которую я передаю класс Model / ViewModel, и эта функция преобразует Datatable в список этой Model / ViewModel, у меня есть попробовал следующий код , но он дает мне ошибку для значений Null , о которых я упоминал ниже.

public static List<T> ConvertDataTable<T>(DataTable dt)
{
    List<T> data = new List<T>();
    foreach (DataRow row in dt.Rows)
    {
        T item = GetItem<T>(row);
        data.Add(item);
    }
    return data;
}
private static T GetItem<T>(DataRow dr)
{
    Type temp = typeof(T);
    T obj = Activator.CreateInstance<T>();

    foreach (DataColumn column in dr.Table.Columns)
    {
        foreach (PropertyInfo pro in temp.GetProperties())
        {
            //if (column.ColumnName == "CreatedOn" || column.ColumnName == "ModifiedOn")
            //    continue;

            if (pro.Name == column.ColumnName)
                if(dr[column.ColumnName] != null)
                    pro.SetValue(obj, dr[column.ColumnName], null);
                else
                    continue;
            }
        }
    return obj;
}

Вызов:

public List<WordInfo> GetData()
{
    DataTable data = _wordsDL.Get("GetAll");
    return Helper.ConvertDataTable<WordInfo>(data);
}

Объект типа 'System.DBNull' нельзя преобразовать в тип 'System.String'. '

1 Ответ

3 голосов
/ 05 февраля 2020

Вам нужно проверить вместо DBNull.Value что-то вроде этого:

if (dr[column.ColumnName] != DBNull.Value)
    pro.SetValue(obj, dr[column.ColumnName], null);

Или:

pro.SetValue(obj, dr[column.ColumnName] == DBNull.Value ? string.Empty : 
      dr[column.ColumnName].ToString(), null);
...