Hi Xpert,
Sure there is a generic method to convert your
DataSet to a compatible class List. For this you will need to have
SAME Property Names and
COMPATIBLE DataTypes in that class like the ones you have in your DataTable. For example if you have a class with name Employee like following:
Code:
[DataContract]
public class Employee
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Salary { get; set; }
[DataMember]
public int Age { get; set; }
[DataMember]
public string JoinDate { get; set; }
[DataMember]
public string Department { get; set; }
}
Then you will use it like this:
Code:
List<Employee> myList = (List<Employee>)DataFiller.ConvertTo<Employee>(DTEmployee);
Remember that your
DataTable (DTEmployee) should have fields with all the above names,i.e.
Name (varchar), Salary (int), Age (int), JoinDate (varchar) and Department (varchar) with compatble DataTypes.
To use the above technique, you need the following class in your Project. The code of that class is as follows:
Code:
using System.Collections.Generic;
using System.Reflection;
using System.Data;
using System;
using System.ComponentModel;
namespace TransM
{
public class DataFiller
{
public static DataTable ConvertTo<T>(IList<T> list)
{
DataTable table = CreateTable<T>();
Type entityType = typeof(T);
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
foreach (T item in list)
{
DataRow row = table.NewRow();
foreach (PropertyDescriptor prop in properties)
{
row[prop.Name] = prop.GetValue(item);
}
table.Rows.Add(row);
}
return table;
}
public static IList<T> ConvertTo<T>(IList<DataRow> rows)
{
IList<T> list = null;
if (rows != null)
{
list = new List<T>();
foreach (DataRow row in rows)
{
T item = CreateItem<T>(row);
list.Add(item);
}
}
return list;
}
public static IList<T> ConvertTo<T>(DataTable table)
{
if (table == null)
{
return null;
}
List<DataRow> rows = new List<DataRow>();
foreach (DataRow row in table.Rows)
{
rows.Add(row);
}
return ConvertTo<T>(rows);
}
public static T CreateItem<T>(DataRow row)
{
T obj = default(T);
if (row != null)
{
obj = Activator.CreateInstance<T>();
foreach (DataColumn column in row.Table.Columns)
{
PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName);
try
{
object value = row[column.ColumnName];
prop.SetValue
(obj, value.ToString(), null);
}
catch
{
// You can log something here
throw;
}
}
}
return obj;
}
public static DataTable CreateTable<T>()
{
Type entityType = typeof(T);
DataTable table = new DataTable(entityType.Name);
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
foreach (PropertyDescriptor prop in properties)
{
table.Columns.Add(prop.Name, prop.PropertyType);
}
return table;
}
}
}
Hope this helps, Xpert...