2013-05-08 2 views
3

Посмотрите на приведенный ниже кодКак конвертировать в список <ExpandoObject> правильно

private static List<ExpandoObject> GetDBDetails() 
     { 
      var directoryPath = Environment.CurrentDirectory.Replace("\\bin\\Debug", "\\DataSource"); 
      var filePath = Path.Combine(directoryPath, "DBDetail.xml"); 
      try 
      { 
       //Load xml 
       XDocument xdoc = XDocument.Load(filePath); 
       if (xdoc == null) return null; 


       List<ExpandoObject> dbDetails = (from dbDetail in xdoc.Descendants("database") 
             select new ExpandoObject 
              { 
               DBDetailId = Convert.ToInt32(dbDetail.Attribute("dbDetailId").Value), 
               DBServerId = Convert.ToInt32(dbDetail.Attribute("dbServerID").Value) 
                           }); 
       return dbDetails; 
      } 
      catch (Exception ex) 
      { 
       McAfee.EnterpriseLibrary.Logging.LogUtil.LogEntry(ex, System.Diagnostics.TraceEventType.Critical); 
       return null; 
      } 
     } 

Я получаю ошибку

System.Dynamic.ExpandoObject»не содержит определения для„DBDetailId“ System.Dynamic.ExpandoObject 'не содержит определения для «DBServerId»

Как исправить это?

+0

Другая альтернатива http://stackoverflow.com/questions/13704752/deserialize- xml-to-object-using-dynamic – I4V

+0

По какой-то причине вы используете 'ExpandoObject' и не создаете новый класс, например« DbDetails », для этой конкретной цели? Intellisense не будет работать за пределами этого метода, и прохождение «динамического» тоже не является хорошей идеей. –

+0

Поскольку тип объекта мне неизвестен, и я не могу создать конкретные классы, поскольку это ограничение (: –

ответ

4

Вам нужно забрасывать ExpandoObject к dynamic:

xdoc.Descendants("database") 
      .Select(dbDetail => 
         { 
          dynamic expandoObj = new ExpandoObject(); 
          expandoObj.DBDetailId = Convert.ToInt32(dbDetail.Attribute("dbDetailId").Value); 
          expandoObj.DBServerId = Convert.ToInt32(dbDetail.Attribute("dbServerID").Value); 
          return (ExpandoObject) expandoObj; 
         }) 
      .ToList(); 

Также вы можете бросить ExpandoObject в IDictionary<string, object>:

var x = new ExpandoObject() as IDictionary<string, object>; 
x.Add("DBDetailId", Convert.ToInt32(dbDetail.Attribute("dbDetailId").Value)); 
x.Add("DBServerId", Convert.ToInt32(dbDetail.Attribute("dbServerID").Value)); 
+0

Но как вернуть List ? Он поступает как IEnumerable

+0

Что-то вроде этого: 'return (ExpandoObject) expandoObj Я обновил ответ. –