Oto jedno rozwiązanie generic bez Zastanawiając się nad właściwościami. Mają metodę rozszerzenia jak poniżej
public static DataTable ConvertToDataTable<TSource>(this IEnumerable<TSource>
records, params Expression<Func<TSource, object>>[] columns)
{
var firstRecord = records.First();
if (firstRecord == null)
return null;
DataTable table = new DataTable();
List<Func<TSource, object>> functions = new List<Func<TSource, object>>();
foreach (var col in columns)
{
DataColumn column = new DataColumn();
column.Caption = (col.Body as MemberExpression).Member.Name;
var function = col.Compile();
column.DataType = function(firstRecord).GetType();
functions.Add(function);
table.Columns.Add(column);
}
foreach (var record in records)
{
DataRow row = table.NewRow();
int i = 0;
foreach (var function in functions)
{
row[i++] = function((record));
}
table.Rows.Add(row);
}
return table;
}
i wywoływać takie same parametry używając gdzie będzie nazwa kolumny w kolejności.
var table = records.ConvertToDataTable(
item => item.Title,
item => item.Street,
item => item.City
);
Co robisz, że potrzebujesz DataTable jako wynik? – dwerner
Próbuję wyeksportować do pliku CSV i już mam metody, które mogą eksportować DataTable/Set do CSV. – TruMan1
Myślę, że szukasz dynamicznego języka programowania w (głównie) statycznie napisanym typie. Jeśli jesteś bardzo przywiązany do tych procedur DataTable do eksportu CSV, obawiam się, że twoja ścieżka może być tylko jednym bieżnikiem. Obiekty anonimowe to dość nowa funkcja językowa, a DataRow/DataTable/DataSet nie zostały zaprojektowane z myślą o nich. – dwerner