使用Datatable创建ExpandoObject

时间:2017-07-19 20:38:35

标签: c# dynamic reflection properties

我是C#的新手,在Stackoverflow.com上经历了很多问题,并没有找到符合我要求的解决方案。所以最后在这里发帖。

我的要求是从数据表列名创建动态属性,并将值设置为数据表中的动态属性。最后将数据绑定到gridview。

所以我决定按照以下步骤来实现这个功能(如果我错了,请告诉我)

我的数据表包含26行和10列数据

  1. 创建A类
  2. 从数据表(列名称)
  3. 向A添加动态属性
  4. 将值设置为A
  5. 的属性
  6. 将A类列入A
  7. A到GridView的绑定列表
  8. 我已完成以下步骤

    1

    [Serializable]
    public class A
    {   
      public A() 
      {   
      }  
    }
    

    2& 3。

    DataTable dt = getData();
    
    dynamic expando = new ExpandoObject();
    
    foreach (DataRow row in dt.Rows)
    {
       foreach (DataColumn col in dt.Columns)
       {
         var expandoDict = expando as IDictionary<String, Object>;
    
         if (expandoDict.ContainsKey(col.ToString()))
           expandoDict[col.ToString()] = row[col.ColumnName].ToString();
         else
           expandoDict.Add(col.ToString(), row[col.ColumnName].ToString());
       }
    }
    

    执行上述for循环后,“expando”对象仅包含数据表的最后一行。

    您能否帮我解决如何修复第2步到第5步的步骤。

2 个答案:

答案 0 :(得分:6)

据我了解,此代码可能更符合您的要求。这应该将数据放入expandoList中。然后,您需要处理与GridView的绑定。

DataTable dt = getData();

List<dynamic> expandoList = new List<dynamic>();

foreach (DataRow row in dt.Rows)
{
    //create a new ExpandoObject() at each row
    var expandoDict = new ExpandoObject() as IDictionary<String, Object>;
    foreach (DataColumn col in dt.Columns)
    {
        //put every column of this row into the new dictionary
        expandoDict.Add(col.ToString(), row[col.ColumnName].ToString());
    }

    //add this "row" to the list
    expandoList.Add(expandoDict);
}

答案 1 :(得分:1)

这是一个将数据表转换为动态对象列表的扩展方法:

public static class DataTableExtension
{
    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; }
        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;
        }
    }
}

用法:IEnumerable<dynamic> result = getData().AsEnumerable();