【问题标题】:C# DynamicObject: Is there a way to access properties by index?C# DynamicObject:有没有办法通过索引访问属性?
【发布时间】:2011-11-09 20:31:44
【问题描述】:

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

List<dynamic> list = _dataStagingManager.GetStatusList(consoleSearch);
foreach (var row in list)
{
    Console.WriteLine(row[0]);
    Console.WriteLine(row[1]);
}

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

【问题讨论】:

  • 它是什么动态对象?你从哪里得到它?
  • 最初,我使用的是通用动态对象类型DynamicObject。事实证明,Dapper 返回的动态对象确实扩展了该对象并包含 Keys 和 Values 属性

标签: c# dynamic indexing


【解决方案1】:

很遗憾,没有。与运行时对象(具有可以轻松反映/查询的成员的可迭代集合)不同,动态对象默认没有这样的集合。它们可以以允许通过名称访问其成员的任何方式实现。只要您不选择自己实现它们,就没有动态对象的索引的概念。

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

【讨论】:

  • 当然。 Unfortunately, no 似乎不正确。这完全取决于您如何编码动态对象。看我的回答
  • 是的。但我认为 OP 正在寻找一种 通用 方法来迭代动态对象(可能不是他控制的对象)的成员,这显然是不可能的。
【解决方案2】:

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

class AnythingGoes : DynamicObject
{
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = binder.Name;
        return true;
    }
}

您有机会获得属性列表。如果动态对象实际上是普通对象(没有实现IDynamicMetaObjectProvider),普通反射就可以正常工作。

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 在您的示例中,row.GetType() 返回 null。
    【解决方案4】:

    如果row 的运行时类型有一个整数索引器,那么您的代码应该没问题。

    【讨论】:

    • 你能举个例子吗?基本上,我有一个 List 类型的对象,其中包含来自 Dapper Dot Net 映射的存储过程的数据结果集。
    • 我对 Dapper Dot Net 不熟悉。但是,例如,如果该行是 ADO.NET DataRow,则表达式 row[0] 将在运行时分派给索引器,该索引器将返回存储在第一列中的值(第二列是 row[1],等)
    猜你喜欢
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2022-08-23
    • 2022-08-02
    • 2011-09-04
    • 2011-11-05
    相关资源
    最近更新 更多