2012-04-16 3 views
1

Я получил класс, который будет принимать XML-файл и динамически генерировать ExpandoObject для передаваемого XML при использовании списков ExpandoObjects и рекурсии.Определить тип объекта в 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>>(), чтобы вернуть bool или что-то в этом роде.

Приветствия

+3

Почему вы не сделать он * всегда * возвращает вам «Список ' - только однозначный список, если есть только одна запись? –

+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

Отлично, это был действительно тот ответ, который я искал. Я буду взвешивать свои два варианта. Приветствия. – RobW

Смежные вопросы