ExpandoObject属性未找到。

3

下面是一个 ViewModel 属性的定义。

private List<ExpandoObject> productList;

public List<ExpandoObject> Products {
    get {

        return productList;
    }

    set {

        productList = value;

    }
}

在所选的产品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
}

抛出一个错误 - 第一次机会异常,告诉我在选择的ExpandoObject中找不到lineNum属性。

我可以将ExpandoObject强制转换为IDictionary<string, object>类型,并通过以下方式访问属性以解决问题:

int passed_in_lineNum = (int)selectedProduct["lineNum"]; 

但这完全违背了使用 ExpandoObject 的目的!

我在这里做错了什么???


我可以问一下,为什么您要使用这样的结构?使用ExpandoObject似乎是一种相当恶劣的代码味道,也是一种架构问题(显然,在与DLR语言进行接口时,不适用此规则)。 - Machinarius
公平的问题 - 我正在处理一堆从外部源动态加载到程序中的属性 - 它们可以是用户想要的任何东西,因此我们不知道它们在编译时的名称。我们既不知道它们的数量,也不知道它们的名称,因此ExpandoObject似乎是此应用程序的正确选择。 - Steven C. Britton
@Machinarius - 你会采取不同的方法吗?如果是这样,我很好奇... - Steven C. Britton
我会选择一个可以持久化的老式键值存储。Redis 可能是个不错的选择?假设用户定义的键可以被散列,并且它们的值只是简单的字符串(或者可以编码为这样),那么一个 KVP 哈希表将会更快,而且意图更加清晰,因为这是它们唯一的目的。 - Machinarius
我需要仔细研究一下,确保它适用于这个特定的情况。在做出决定之前,我需要进行更深入的挖掘。尽管这个问题只基于应用程序的一个非常小的片段,但我有意省略了大部分内容。这个项目的其他各种方面使得问题变得更加复杂。话虽如此,感谢您给的指针 - 我一定会跟进的。 - Steven C. Britton
没问题。我认为使用字典比在DLR对象上进行反射更快。也许值得进行性能测试。 - Machinarius
1个回答

3

您在工具 -> 选项 -> 调试 -> 一般 中是否取消了“启用仅限我的代码”?由于这是第一次发现的异常,DLR 很可能会抛出并捕获它(我能够通过取消“启用仅限我的代码”来重现此问题)。尝试忽略异常或选择“启用仅限我的代码”,看看是否可以解决问题。


... 嗯,看起来问题解决了;当然,在代码中我已经完全改变了对 ExpandoObject 的所有引用。grrrr :) - Steven C. Britton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接