Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Datatable创建ExpandooObject_C#_Dynamic_Reflection_Properties - Fatal编程技术网

C# 使用Datatable创建ExpandooObject

C# 使用Datatable创建ExpandooObject,c#,dynamic,reflection,properties,C#,Dynamic,Reflection,Properties,我是C#的新手,在Stackoverflow.com上遇到了很多问题,没有找到符合我要求的解决方案。最后在这里发布 我的要求是从datatable列名创建动态属性,并将值设置为datatable中的动态属性。最后将数据绑定到gridview 因此,我决定按照以下步骤实现此功能(如果我错了,请纠正我) my datatable包含26行和10列数据 创建一个类a 将动态属性添加到from datatable(列名) 将值设置为对象的属性 将A类列为A类的列表 将列表绑定到GridView 我已经完

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

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

因此,我决定按照以下步骤实现此功能(如果我错了,请纠正我)

my datatable包含26行和10列数据

  • 创建一个类a
  • 将动态属性添加到from datatable(列名)
  • 将值设置为对象的属性
  • 将A类列为A类的列表
  • 将列表绑定到GridView
  • 我已经完成了以下步骤

    一,

    二,三

    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());
       }
    }
    
    DataTable dt=getData();
    动态expando=新的ExpandoObject();
    foreach(数据行中的数据行)
    {
    foreach(dt.列中的数据列列列)
    {
    var expandoDict=expando作为IDictionary;
    if(expandoDict.ContainsKey(col.ToString()))
    expandoDict[col.ToString()]=行[col.ColumnName].ToString();
    其他的
    expandoDict.Add(col.ToString(),row[col.ColumnName].ToString());
    }
    }
    
    执行上述for循环后,“expando”对象只包含datatable的最后一行


    您能否帮助我修复步骤2到5。

    据我所知,此代码可能更符合您的要求。这将为您将数据放入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);
    }
    
    DataTable dt=getData();
    List expandoList=新列表();
    foreach(数据行中的数据行)
    {
    //在每行创建一个新的ExpandooObject()
    var expandoDict=new ExpandoObject()作为IDictionary;
    foreach(dt.列中的数据列列列)
    {
    //将此行的每一列都放入新词典
    expandoDict.Add(col.ToString(),row[col.ColumnName].ToString());
    }
    //将此“行”添加到列表中
    expandoList.Add(expandoDict);
    }
    
    这里有一个扩展方法,可以将数据表转换为动态对象列表:

    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;
            }
        }
    }
    
    公共静态类DataTableExtension
    {
    公共静态IEnumerable作为动态numerable(此数据表)
    {
    //在此处验证参数。。
    return table.AsEnumerable().Select(row=>newdynamicrow(row));
    }
    私有密封类DynamicObject:DynamicObject
    {
    私有只读数据行_行;
    内部动态(数据行){u行=行;}
    公共重写bool TryGetMember(GetMemberBinder绑定器,输出对象结果)
    {
    var retVal=_row.Table.Columns.Contains(binder.Name);
    结果=返回?\行[活页夹名称]:空;
    返回返回;
    }
    }
    }
    

    用法:
    IEnumerable结果=getData().AsEnumerable()

    你基本上有一本字典。在每个循环中,您将查找列的名称,并将其用作键。然后将该键处的值重新指定为该行中该列的值。在我看来,你真正想要的是一个ExpandoObject列表,而不是一个。每个内部循环应该向该列表中添加另一个ExpandooObject,而不是在同一个对象上重新分配值。非常感谢user1304444。这有帮助。我将研究如何将列表绑定到gridview。实际上,我正在绑定代码隐藏代码中的所有列。关闭AutoGenerateColumns=“false”。绑定expandoList时,gridview无法在列表下找到列名。任何线索。我无法建立这个陈述。IEnumerable=dt.AsEnumerable();获取“仅分配调用增量减量等待,新对象表达式可以用作语句”我没有定义变量名。查看更新的答案,明白了。非常感谢。
    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;
            }
        }
    }