"System.Dynamic.ExpandoObject" не содержит определения для PropertyName"

У меня есть следующий код, который генерирует динамический объект из файла XML:

С#

    private static List<dynamic> GetClientObject()
    {
        var xDoc = XDocument.Load(new StreamReader(xmlPath + @"\client.xml"));
        dynamic root = new ExpandoObject();
        XmlToDynamic.Parse(root, xDoc.Elements().First());
        List<dynamic> clients = new List<dynamic>();

        for (int i = 0; i < root.clients.client.Count; i++)
        {
            clients.Add(new ExpandoObject());
            clients[i].Id = root.clients.client[i].id;
            clients[i].Name = root.clients.client[i].name;
            List<string> list = new List<string>();

            for (int j = 0; j < root.clients.client[i].emails.email.Count; j++)
            {
                list.Add(root.clients.client[i].emails.email[j].ToString());
            }

            clients[i].Email = string.Join(",", list);
        }
        return clients;
    }

XML

<clients>
    <client>
        <id>SomeId</id>
        <name>SomeName</name>
        <emails>
            <email>[email protected]</email>
            <email>[email protected]</email>
            <email>[email protected]</email>
        </emails>
        <timezone>Mountain Standard Time</timezone>
    </client>
</clients>

Код работает нормально, но я всегда вижу следующее исключение (несколько раз) в IntelliTrace:

Исключение: брошено: «System.Dynamic.ExpandoObject» не содержит определения для «клиента» (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException) Исключение Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: «System.Dynamic.ExpandoObject» не содержит определения «клиент»

Что-то не так с моим кодом?


person Learner    schedule 16.08.2013    source источник
comment
Похоже, условие цикла должно быть root.clients.Count, а не root.clients.client.Count.   -  person alex    schedule 16.08.2013
comment
Пожалуйста, проверьте обновленный формат XML.   -  person Learner    schedule 16.08.2013
comment
Без (части) XML невозможно сказать, имеет ли смысл root.clients.client.Count. Кроме того, относится ли остальная часть трассировки стека к строке вашего собственного кода?   -  person Henk Holterman    schedule 16.08.2013
comment
Хорошо, для справки: itdevspace.com /2012/07/parse-xml-to-dynamic-object-in-c.html   -  person Henk Holterman    schedule 16.08.2013
comment
Нет @HenkHolterman, трассировка стека относится только к номеру потока, а не к строке кода.   -  person Learner    schedule 16.08.2013
comment
:D Это именно то, что я использовал для создания @HenkHolterman.   -  person Learner    schedule 16.08.2013
comment
Я знаю, ссылка не помешала бы.   -  person Henk Holterman    schedule 16.08.2013


Ответы (1)


Я понимаю, что это ожидаемое поведение при использовании ExpandoObject. Я просмотрел журнал IntelliTrace для этого кода, и записи для исключений, которые вы видите, объединены в пары:

  • Исключение:Выброшено: «System.Dynamic.ExpandoObject не содержит определения для клиентов» (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).
  • Исключение: Поймано: «System.Dynamic.ExpandoObject не содержит определения для клиентов» (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).

то есть исключение выбрасывается, а затем перехватывается. Если вы посмотрите на окно стека вызовов, вы увидите, что броски и перехваты находятся в .NET Framework.

Кстати, мне пришлось внести небольшое изменение в ваш код, чтобы он заработал: я изменил: root.clients.client.Count на root.clients.Count в цикле for.

person Colin Thomsen    schedule 21.08.2013