2014-09-25 92 views
2

这是一个ViewModel属性定义。ExpandoObject属性未找到

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 <字符串,对象>类型,然后访问属性是这样的:

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

但完全失去了使用的ExpandoObject的宗旨!

什么。上午。我在做。错误。这里???

+0

我可以问你为什么使用这样的构造?使用ExpandoObject看起来像是一种非常令人讨厌的代码味道,也是一种体系结构(显然,当您与DLR语言进行交互时,这不适用)。 – Machinarius 2014-09-25 21:56:18

+0

公平的问题 - 我正在处理一堆从外部来源加载到程序中的属性 - 动态的 - 它们可以是用户希望他们成为的任何用户,所以我们不知道它们在编译时被命名为什么,时间。我们既不知道它们的数量,也不知道它们的名称,所以ExpandoObject似乎是适用于此应用程序的正确选择。 – 2014-09-25 22:06:29

+0

@Machinarius - 你会采取不同的方法?如果是这样,我很好奇... – 2014-09-25 22:15:50

回答

1

您是否在工具 - >选项 - >调试 - >常规下取消选中“启用我的代码”?因为这是第一次机会例外,所以DLR极有可能引发并捕获它(我可以通过“启用只是我的代码”来取消选中)。尝试忽略异常或检查“启用我的代码”并查看它是否有效。

+0

... aaaaaand似乎已经修复它;当然,我完全改变了代码中对ExpandoObject的引用。 grrrr :) – 2014-09-25 22:12:22