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

时间:2011-11-09 20:31:45

标签: c# dynamic indexing

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

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

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

4 个答案:

答案 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的运行时类型是一个整数索引器,那么你的代码应该没问题。