【发布时间】:2014-09-25 21:40:00
【问题描述】:
这是一个 ViewModel 属性定义。
private List<ExpandoObject> productList;
public List<ExpandoObject> Products {
get {
return productList;
}
set {
productList = value;
}
}
在 selectedProduct ExpandoObject 上,我有一个名为 lineNum 的属性,它以 ExpandoObjects 的标准方式设置:
product.lineNum = some_integer;
现在,在驻留在另一个对象中的方法中,我有这个。 object_passed_in 被声明为 Object,并且传入了 productList 的一个成员。
var selectedProduct = object_passed_in as ExpandoObject
// I have tried this as "dynamic", too
当我设置断点并观察“selectedProduct.lineNum”时,手表工作得很好——它显示了正确的值。不过……
if (selectedProduct.lineNum == some_comparison_value) {
// some lines of code
}
抛出一个错误 - 第一次机会异常,告诉我 lineNum 不是 ExpandoObject selectedProduct 上的属性。
我可以通过将 ExpandoObject 强制转换为 IDictionary 类型,然后以这种方式访问属性来击败 ExpandoObject:
int passed_in_lineNum = (int)selectedProduct["lineNum"];
但这完全违背了使用 ExpandoObject 的目的!
什么。是。我在做。错误的。这里???
【问题讨论】:
-
请问您为什么要使用这样的结构?使用 ExpandoObject 似乎是一种非常讨厌的代码味道,而且也是一种架构性的味道(显然,这不适用于与 DLR 语言交互时)。
-
公平的问题-我正在处理从外部源加载到程序中的一堆属性-动态-它们可以是用户想要的任何东西,所以我们不知道它们在编译时的名称。我们既不知道它们的数量,也不知道它们的名称,因此 ExpandoObject 似乎很适合这个应用程序。
-
@Machinarius - 你会采取不同的方法吗?如果是这样,我很好奇......
-
我会选择一个我可以坚持的老式键值存储。也许是 Redis?假设用户定义的键可以被散列并且它们的值只是字符串(或者可以这样编码),KVP 散列图会更快并且意图会更清晰,因为这是它们的唯一目的。
-
我得调查一下;当然。我不知道它是否适用于这种特殊情况,在做出决定之前我需要做更多的挖掘。不过,这个问题仅基于较大应用程序的一个非常小的 sn-p,其中大部分是我故意遗漏的。然而,这个项目的其他各个方面确实使问题比这更复杂。也就是说,感谢您的指点 - 我一定会跟进。
标签: c# .net expandoobject