我需要将动态对象(即List<DynamicRow>
)转换为匿名类型对象列表,但我需要在运行时使用 linq 或其他方式将动态对象的所有属性创建为匿名类型对象。
这可能吗?如果是这样,我该怎么做?
这个动态对象几乎是一个网格类,其中包含列 ieList<String>
和行 ie的列表List<DynamicRow>
。
我可以使用列名 ie 访问 DynamicRow 对象(例如 Order)中保存的值Order[<columnName>] -> Order["OrderNumber"]
,所以我希望能够使用 Linq 做同样的事情。
有没有办法遍历列列表并为根据列名设置每个属性的每一行创建一个匿名对象类型。
虽然我知道下面的代码不起作用,但它可能会使我想要实现的目标更加清晰:
所以不要有这个:
var itemsList = from p in customerOrderCsvReader
select new
{
Item = p.ElementAt(0).Value,
Description = p.ElementAt(1).Value,
Comment = p.ElementAt(2).Value
};
我想要这样的东西,因为我不会提前知道项目、描述和评论等属性名称。我知道动态对象中的内容的唯一方法是使用列名。
var itemsList = from p in customerOrderCsvReader
select new
{
foreach string columnName in customerOrderCsvReader.columnNames
{
<columnName as property> = p.ElementAt(0).Value;
}
};
另一个问题,假设上述是可行的,有没有办法让我使用一个键来访问 p 的属性,即 columnName 而不是 p.ElementAt。
更新
我可能应该更清楚。我正在尝试将其绑定到网格,但我也在尝试保持此通用性,以便它可以在任何平台上工作,而不仅仅是 winform。
如果我使用@jjchiw 提供的代码,则在将其输出到我的输出窗口时会得到以下信息:
Count = 6
[0]: {System.Dynamic.ExpandoObject}
[1]: {System.Dynamic.ExpandoObject}
[2]: {System.Dynamic.ExpandoObject}
[3]: {System.Dynamic.ExpandoObject}
[4]: {System.Dynamic.ExpandoObject}
[5]: {System.Dynamic.ExpandoObject}
但是,如果我使用 linq 并提供一些虚拟属性名称并使用以下方式为其分配一些值:
var itemsList = from p in customerOrderCsvReader
select new
{
CustomerId = p.ElementAt(0),
EmployerId = p.ElementAt(1),
Description = p.ElementAt(2)
};
我得到以下输出到我的输出窗口:
Count = 6
[0]: { CustomerId = "GREAL", EmployerId = "6", Description = "1997-05-06T00:00:00" }
[1]: { CustomerId = "HUNGC", EmployerId = "3", Description = "1997-05-06T00:00:00" }
[2]: { CustomerId = "LAZYK", EmployerId = "8", Description = "1997-05-06T00:00:00" }
[3]: { CustomerId = "LETSS", EmployerId = "1", Description = "1997-05-04T00:00:00" }
[4]: { CustomerId = "WALLM", EmployerId = "5", Description = "1997-05-04T00:00:00" }
[5]: { CustomerId = "TOTAL", EmployerId = "4", Description = "1997-05-06T00:00:00" }
将动态列表绑定到我的网格时,它不显示任何内容,但使用匿名类型列表时,它在技术上现在包含“可识别”对象的列表,即我的网格,相应地显示数据。
无论如何强制动态列表表现得像一个匿名列表,以便我可以将动态列表绑定到我的网格但显示正确的结果。