2012-04-16 10 views
1

私はXMLファイルを受け取り、ExpandoObjectsと再帰のリストを利用して渡されるXMLに対してExpandoObjectを動的に生成するクラスを派生しました。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<ExpandoObject>を取得しています。私は返される型を決定する最も簡単な解決策を決定しようとしています。

理想的には、x.insured.OfType<List<ExpandoObject>>()のようなもので、その性質のブールなどを返すことができます。

乾杯

+3

をそれは常に 'List 'を返します - エントリが1つだけの場合は単一値のリストですか? –

+0

このコードを可能な限り動的に再利用できるようにしようとして、これが発生しない場所では複雑になると感じています。上記のサンプルXMLは、実際のソースの複雑な性質を反映していません。 – RobW

+0

これは代表的な例を挙げないと問題です:)しかし、サブ要素名を参照すると常に一致のシーケンス*が得られる*シンプルなモデルを提示するのが最も一貫したアプローチだと思います。 –

答えて

1

あなたはジョンスキートの助けを借りてこれを解決していているように見えますが、あなたが迷っている場合、あなたはこのためis演算子を使用することができます:あなたが作るていないのはなぜ

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

優秀、それは本当に私が探していた答えでした。私は私の2つの選択肢の重さを測ります。乾杯。 – RobW

関連する問題