调用动态属性“ints”的属性名称:无法调用属性

时间:2014-08-06 17:49:45

标签: c# linq expandoobject idictionary

我将动态对象的属性名称指定为字符串形式的整数。 int值表示我正在使用的数据库中的int ID。但是我仍然坚持如何检索分配给属性的值,如下所示:

dynamic test = new ExpandoObject()
IDictionary<string, object> proxyFiler = test as IDictionary<string, object>;
proxyFiler["four"] = 4;
proxyFiler["5"] = 5;
int r = test.four; // Works
int s = test.5; // Doesn't work

读取数据库的方法将返回&#34; int&#34;我希望能够使用该属性名称访问属性值。

要对此进行扩展:如果我想根据属性名称执行linq查询来排序动态对象列表,该怎么办?在这种情况下,我需要获取我已检索的propertyName作为字符串,例如&#34; 15&#34;:

 return disorderedList.OrderBy(o => o.propertyName).ToList();

有没有人知道这个问题的简单解决方案,还是您推荐不同的方法?感谢。

1 个答案:

答案 0 :(得分:4)

为了dynamic以这种方式工作,密钥必须遵循C#中有效标识符名称的规则(规则在此outdated MSDN page中指定,但也在C#语言规范中指定)。单个数字(5)不是允许的标识符名称,这就是为什么它不起作用。

请注意, 仍然可以使用类型作为字典来检索值,其方式与填充方式类似。

至于你的第二个例子 - 你永远不会使用value,所以它没有效果。这和写int r = test.four;

一样

编辑:

我相信,根据你的方法,你需要输入字典:

return disorderedList
          .OrderBy(o => ((IDictionary<string, object>)o)[propertyName]).ToList();