【问题标题】:ExpandoObject Property not found未找到 ExpandoObject 属性
【发布时间】: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


【解决方案1】:

您是否在工具 -> 选项 -> 调试 -> 常规下未选中“仅启用我的代码”?由于这是第一次机会异常,因此 DLR 极有可能抛出并捕获它(我能够在未选中“启用我的代码”的情况下重现此情况)。尝试忽略异常或检查“仅启用我的代码”,看看它是否有效。

【讨论】:

  • ... aaaaa 似乎已经解决了;之后,当然,我已经完全改变了代码中对 ExpandoObject 的每个引用。 grrr :)
猜你喜欢
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 2019-01-26
  • 2013-10-13
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
相关资源
最近更新 更多