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。