Search code examples
c#dynamicdatatableienumerable

How can I convert a DataTable into a Dynamic object?


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?


Solution

  • 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;