using System.Collections.Generic;
public static void Main()
var people = new List<Person> { new Person{Name="Jamie", Age=10, Location="UK" }, new Person{Name="Fred", Age=30, Location="US" } };
var props = new Dictionary<string,string>
["Name"] = "Person Name",
var dt = ToDataTable(people, props);
foreach(DataColumn col in dt.Columns)
Console.WriteLine(col.ColumnName);
foreach(DataRow row in dt.Rows)
foreach(DataColumn col in dt.Columns)
Console.WriteLine(row[col]);
public string Name {get;set;}
public int Age {get;set;}
public string Location {get;set;}
public static DataTable ToDataTable<T>(List<T> items, Dictionary<string,string> properties)
DataTable dataTable = new DataTable(typeof(T).Name);
PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(p => properties.ContainsKey(p.Name)).ToArray();
foreach (PropertyInfo prop in Props)
dataTable.Columns.Add(properties[prop.Name]);
foreach (T item in items)
var values = new object[Props.Length];
for (int i = 0; i < Props.Length; i++)
values[i] = Props[i].GetValue(item, null);
dataTable.Rows.Add(values);