【问题标题】:Calling the property names of a dynamic property "ints": can't call property调用动态属性“ints”的属性名称:不能调用属性
【发布时间】:2014-08-07 02:57:13
【问题描述】:

我将动态对象的属性名称分配为字符串形式的整数。 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();

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

【问题讨论】:

  • 为什么第二个例子会起作用? value 未使用。
  • 为什么一定要说test.5而不是proxyFiler["5"]?

标签: c# linq expandoobject idictionary


【解决方案1】:

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

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

至于你的第二个例子——你从来没有使用过value,所以它没有效果。就跟写int r = test.four;是一样的


编辑:

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

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

【讨论】:

  • 谢谢 Reed,你认为有办法解决这个问题吗?我已编辑问题以更好地解释我的问题。
  • @Nic 只需将其作为字典访问 - 与您存储它的方式相同
  • 再次感谢@ReedCopsey。我现在已经扩展了这个问题。
  • @Nic 我相信我发布的内容会如你所愿。
  • 非常感谢@ReedCopsey,非常有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多