How can I convert a DataTable
in IEnumerable<dynamicObject>
?
For example, I want to convert any DataTable
ID | Name DI | emaN
--------- or ---------
1 | x 2 | x
2 | y 1 | y
In a list of objects
// list 1 (ex 1) // list 2 (ex 2)
{ {
{ ID = 1, Name = "x" } { DI = 2, emaN = "x" }
{ ID = 2, Name = "y" } { DI = 1, emaN = "y" }
} }
So
list1.First().ID // 1
list2.First().emaN // "x"
How can I do it?
How about with DynamicObject
:
public static class DataTableX
{
public static IEnumerable<dynamic> AsDynamicEnumerable(this DataTable table)
{
// Validate argument here..
return table.AsEnumerable().Select(row => new DynamicRow(row));
}
private sealed class DynamicRow : DynamicObject
{
private readonly DataRow _row;
internal DynamicRow(DataRow row) { _row = row; }
// Interprets a member-access as an indexer-access on the
// contained DataRow.
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var retVal = _row.Table.Columns.Contains(binder.Name);
result = retVal ? _row[binder.Name] : null;
return retVal;
}
}
}
You could also try overriding TrySetMember
if you wish to make the dynamic-row writable.
Usage:
DataTable table = ...
var dynamicTable = table.AsDynamicEnumerable();
var firstRowsNameField = dynamicTable.First().Name;