【问题标题】:Determine Object Type in ExpandoObject确定 ExpandoObject 中的对象类型
【发布时间】:2012-04-16 18:34:59
【问题描述】:

我已经派生了一个类,该类将采用 XML 文件并动态生成 ExpandoObject,以便利用 ExpandoObjects 列表和递归为传入的 XML 动态生成 ExpandoObject。

将其传回以进行处理以检索数据有效,但我从遗留系统检索的 XML 不一致。我可以这样取回单个节点

<test>
 <insured>
  <a>BLAH BLAH BLAH</a>
  <b>BLAH BLAH BLAH</b>
  <c>BLAH BLAH BLAH</c>
 </insured>
</test>

<test>
 <insured>
  <a>BLAH BLAH BLAH</a>
  <b>BLAH BLAH BLAH</b>
  <c>BLAH BLAH BLAH</c>
 </insured>
 <insured>
  <a>BLAH BLAH BLAH</a>
  <b>BLAH BLAH BLAH</b>
  <c>BLAH BLAH BLAH</c>
 </insured>
 <insured>
  <a>BLAH BLAH BLAH</a>
  <b>BLAH BLAH BLAH</b>
  <c>BLAH BLAH BLAH</c>
 </insured>
</test>

所以对于“被保险人”的关键,我要么得到ExpandoObject 要么得到List&lt;ExpandoObject&gt;。我正在尝试确定最简单的解决方案来确定返回的类型。

理想情况下,就像x.insured.OfType&lt;List&lt;ExpandoObject&gt;&gt;() 返回一个布尔值或类似性质的东西。

干杯

【问题讨论】:

  • 你为什么不让它总是给你一个List&lt;ExpandoObject&gt; - 如果只有一个条目,只是一个单值列表?
  • 在尝试使此代码尽可能可重用和动态化时,我觉得这会使事情变得复杂,因为这不会发生。我上面给出的示例 XML 并没有反映真实来源的复杂性。
  • 这就是没有给出代表性例子的问题:) 但我认为呈现一个 simple 模型,其中引用子元素名称总是得到一个 sequence匹配次数是最一致的方法。
  • 感谢乔恩的反馈。进一步考虑这一点并与同事交谈,我认为这将是最简单的解决方案,只是在实施时需要牢记。干杯。

标签: c# .net xml expandoobject


【解决方案1】:

看起来您可能已经在 J​​on Skeet 的帮助下解决了这个问题,但如果您想知道,您可以使用 is 运算符来解决这个问题:

if(x.insured is List<ExpandoObject>) {
    foreach(dynamic item in x.insured) {
        DoSomething(item);
    }
} else {
    DoSomething(x.insured);
}

【讨论】:

  • 非常好,这确实是我正在寻找的答案。我会权衡我的两个选择。干杯。
猜你喜欢
  • 2016-09-06
  • 2011-01-14
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多