有没有办法按索引访问动态对象的属性?
List<dynamic> list = _dataStagingManager.GetStatusList(consoleSearch);
foreach (var row in list)
{
Console.WriteLine(row[0]);
Console.WriteLine(row[1]);
}
在此示例中,row [0]的属性名称根据存储过程列别名的结果而不同。
答案 0 :(得分:4)
不幸的是,没有。与运行时对象(具有可轻松反映/查询的成员的可迭代集合)不同,默认情况下,动态对象没有此类集合。它们可以以任何方式实现,允许通过名称访问其成员。如果你不选择自己实现它们,就不知道带有动态对象的索引。
如果您愿意,可以覆盖动态类型的TryGetIndex
方法以提供索引支持。
答案 1 :(得分:2)
一般来说,这是不可能的。例如,您可以创建一个具有所有可能属性的动态对象:
class AnythingGoes : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
您有可能获得属性列表。如果动态对象实际上是普通对象(未实现IDynamicMetaObjectProvider
的对象),则正常反射将正常工作。
如果对象实际上是动态的(实现IDynamicMetaObjectProvider
),您可以尝试在GetDynamicMemberNames()
返回的DynamicMetaObject
上调用GetMetaObject()
。但是,正如上面的例子所示,这不能保证有效。
答案 2 :(得分:0)
我对Dapper Dot Net并不熟悉,但经过简短的研究后,它看起来好像是将匿名类型作为动态对象返回。您可以将它们视为POCO(普通的旧CLR对象),这意味着它们是具有单独命名属性的类,可能没有实现您需要通过索引访问字段的任何类型的索引器。
您可以尝试使用Reflection来实现类似的功能:
foreach (dynamic propInfo in row.GetType().GetProperties())
{
Console.WriteLine("{0}: {1}", propInfo.Name, propInfo.GetValue(row, null));
}
我不确定你会以存储过程返回它们的顺序获取属性。
答案 3 :(得分:-2)
如果row
的运行时类型是一个整数索引器,那么你的代码应该没问题。