C# 使用Datatable创建ExpandooObject
我是C#的新手,在Stackoverflow.com上遇到了很多问题,没有找到符合我要求的解决方案。最后在这里发布 我的要求是从datatable列名创建动态属性,并将值设置为datatable中的动态属性。最后将数据绑定到gridview 因此,我决定按照以下步骤实现此功能(如果我错了,请纠正我) my datatable包含26行和10列数据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 我已经完
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;
}
}
}