c# - 调用动态属性的属性名 "ints": can't call property

标签 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

读取数据库的方法将返回一个“int”,我希望能够使用该属性名称访问属性值。

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

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

有没有人知道这个问题的简单解决方案,或者您推荐一种不同的方法?谢谢。

最佳答案

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

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

至于您的第二个示例 - 您从未使用过 value,因此它没有任何效果。这和只写 int r = test.four;

是一样的

编辑:

我相信,根据您的方法,您需要转换为字典:

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

关于c# - 调用动态属性的属性名 "ints": can't call property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25166874/

相关文章:

c# - 如何从指针地址获取对象

c# - 在 SQLite 数据库中创建两个表之间的关系

c# - 你能推荐一个更好的替代这个正则表达式的方法吗?

c# - 如何使用 Entity Framework 和 LINQ to SQL 以及 LinqKit PredicateBuilder 或 IdeaBlade DevForce 过滤相关数据

linq - 具有特定 where/order by 子句的通用 Linq

c# - 将 ExpandoObject 持久化到 MongoDB

c# - 是否可以使用 ExpandoObject 创建运行时属性?

c# - 每次执行命令时停止打开新的命令窗口

c# - Linq 表达式和 foreach 产生不同的结果

asp.net - 如何使 WebMethods 序列化 ExpandoObject