如何在没有现有类属性的情况下将DataTable转换为runtype上的List?

时间:2012-12-06 17:27:52

标签: c# .net list generics reflection

我正在使用VS2010和C#。我有一个DataTable,我想转换为List。

Suppose:
Table dt;

在运行时想要从数据表创建类似的字段并填充List中的字段。列表属性没有现有的类。

ListName=TableName
List property name=Table column name
List Property type=Table column type
List items=Table rows

注意:最近在EF上工作。为满足我的项目要求,需要灵活地在运行时输入和执行ESQL。我不想把这个执行结果放在datatable或List<DataRow>,想将此结果列入清单。  List没有现有的类和属性,不想在列表Type:DataRow

上转换DataTable

1 个答案:

答案 0 :(得分:1)

我们仍然不确定您要做什么,但如果您想创建动态对象列表,可以尝试dynamic

var dynamicList = new List<dynamic>();   

然后,您必须通过ExpandoObject

为该列表指定值

您必须将其转换为IDictionary以将列名称作为属性传递。

然后您可以访问此类item.YourColumnName

之类的列表项

以下是一个完整的例子:

            var dynamicList = new List<dynamic>();
            DataTable dt = new DataTable();
            dt.Columns.Add("Col1");
            dt.Columns.Add("Col2");
            dt.Rows.Add("val1","val2");
            dt.Rows.Add("val3", "val4");
            foreach (DataRow dr in dt.Rows)
            {
                dynamic myObj = new ExpandoObject();
                var p = myObj as IDictionary<string, object>;
                p[dr.Table.Columns[0].ColumnName] = dr[0];
                p[dr.Table.Columns[1].ColumnName] = dr[1];
                dynamicList.Add(p);
            }

            foreach (var item in dynamicList)
            {
                Console.WriteLine(item.Col1 + " " + item.Col2);
            }   

或linq当然也可用于打印出值:

dynamicList.ForEach(x => Console.WriteLine(x.Col1 + " " + x.Col2));   

这个程序将打印出来:

val1 val2
val3 val4