C#DynamicObject:有没有办法通过索引访问属性?

C#DynamicObject:有没有办法通过索引访问属性?,c#,dynamic,indexing,C#,Dynamic,Indexing,有没有办法通过索引访问动态对象的属性 List<dynamic> list = _dataStagingManager.GetStatusList(consoleSearch); foreach (var row in list) { Console.WriteLine(row[0]); Console.WriteLine(row[1]); } List List=\u dataStagingManager.GetStatusList(控制台搜索); foreach

有没有办法通过索引访问动态对象的属性

List<dynamic> list = _dataStagingManager.GetStatusList(consoleSearch);
foreach (var row in list)
{
    Console.WriteLine(row[0]);
    Console.WriteLine(row[1]);
}
List List=\u dataStagingManager.GetStatusList(控制台搜索);
foreach(列表中的变量行)
{
Console.WriteLine(第[0]行);
Console.WriteLine(第[1]行);
}

在本例中,行[0]的属性名称因存储过程列别名的结果而异。

如果
行的运行时类型为具有整数索引器,则您的代码应保持原样。

不幸的是,不是。与运行时对象不同(具有易于反映/查询的成员的iterable集合)默认情况下,动态对象没有此类集合。它们可以通过任何方式实现,允许按名称访问其成员。如果您不选择自己实现,则不知道动态对象的索引

如果愿意,您可以覆盖动态类型上的方法以提供索引支持。

我不熟悉,但看了一眼之后,它看起来像是以动态对象的形式返回匿名类型。您可以将其视为POCO(普通的旧CLR对象)这意味着它们是具有单独命名属性的类,可能没有实现任何类型的索引器,您需要通过索引访问字段

您可以尝试使用反射来实现类似的效果:

foreach (dynamic propInfo in row.GetType().GetProperties())
{
    Console.WriteLine("{0}: {1}", propInfo.Name, propInfo.GetValue(row, null));
}

但是,我不确定您是否会按照存储过程返回属性的相同顺序获取属性。

通常,这是不可能的。例如,您可以创建一个具有所有可能属性的动态对象:

class AnythingGoes : DynamicObject
{
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = binder.Name;
        return true;
    }
}
您有可能获得属性列表。如果动态对象实际上是普通对象(未实现
IDynamicMetaObjectProvider
),则普通反射可以正常工作


如果对象实际上是动态的(实现
IDynamicMetaObjectProvider
),您可以尝试调用从返回的
DynamicMetaObject
。但是,正如上面的示例所示,这不能保证工作。

您能举个例子吗?基本上,我有一个List类型的对象,其中包含Dapper Dot Net映射的存储过程的数据结果集。我不熟悉Dapper Dot Net。但是,例如,如果该行是ADO.NET DataRow,则表达式行[0]将在运行时调度到索引器,该索引器将返回存储在第一列(第二列为行[1])中的值,以此类推当然。
不幸的是,no
似乎不正确。这完全取决于您如何对动态对象进行编码。请参阅我的回答是的。但我认为OP正在寻找一种通用方法来迭代动态对象的成员(可能不是他控制的对象)这显然是不可能的。它是什么类型的动态对象?从何处获得它?最初,我使用的是通用的动态对象类型DynamicObject。事实证明Dapper返回的动态对象扩展了这个对象,并在示例中包含一个键和值属性
行。GetType()
返回null。