2013-08-16 3 views
0

У меня есть следующий код, который генерирует динамический объект из XML-файла:« 'System.Dynamic.ExpandoObject' не содержит определения для "PropertyName"

C#

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> 

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

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

есть все, что случилось с моим кодом?

+0

Похоже, что условие цикла должно быть root.clients.Count, а не root.clients.client.Count – alex

+0

Проверьте обновленный формат XML. – Learner

+0

Без (куска) XML невозможно определить, имеет ли смысл 'root.clients.client.Count'. Кроме того, остальная часть stacktrace относится к строке вашего собственного кода? –

ответ

1

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

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

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

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