2011-03-01 32 views
5

是否有一個ExpandoObject的初始化語法,我可以在LINQ to XML查詢中使用我的優點以簡化操作?從LINQ到XML選擇查詢實現動態對象的簡短方法?

注意:查詢的結果旨在超出當前程序集的範圍,因此匿名類型不在問題中(see why here)。

我試圖用簡單的類似下面的語法來創建動態/的expando對象:

public IEnumerable<dynamic> ParseUserXml(string strXmlUser) { 

var qClients = 
    from client in xdoc.Root.Element(XKey.clients).Elements(XKey.client) 
    // client object 

    // I cannot get ExpandoObject to initialize inline 
    select new ExpandoObject() {  // try initialization syntax, COMPILE ERR 
     OnlineDetails = new 
     { 
      Password = client.Element(XKey.onlineDetails). 
       Element(XKey.password).Value, 
      Roles = client.Element(XKey.onlineDetails). 
       Element(XKey.roles).Elements(XKey.roleId). 
       Select(xroleid => xroleid.Value) 
      // More online detail fields TBD 
     }, 

     // etc .... 

     // YIELD DYNAMIC OBJECTS BACK THROUGH IEnumerable<dynamic>... 
     foreach (var client in qClients) 
     { 
      yield return client; 
     } 

更多地參與解決方案,使此代碼的工作可能是:

  • 創建具體類並初始化它(但我不想創建一堆)。
  • 使用匿名類型及其成員複製到一個動態物體(有些多餘),並返回動態對象

有一個同樣短的語法來實現我打算通過錯誤代碼有問題的事,或者我將不得不以某種方式擴展代碼庫以獲得期望的結果?

回答

0

我結束了使用的Jon Skeet's code answers from a related question之一。代碼示例在這裏複製後代。它使用原始類而不是查詢語法。

// Code answer by Jon Skeet. 
var qClients = xdoc.Root 
     .Element(XKey.clients) 
     .Elements(XKey.client) 
     .Select(client => { 
      dynamic o = new ExpandoObject(); 
      o.OnlineDetails = new ExpandoObject(); 
      o.OnlineDetails.Password = client.Element(XKey.onlineDetails) 
              .Element(XKey.password).Value; 
      o.OnlineDetails.Roles = client.Element(XKey.onlineDetails) 
             .Element(XKey.roles) 
             .Elements(XKey.roleId) 
             .Select(xroleid => xroleid.Value); 
      return o; 
     }); 
1

不幸的是,我認爲你不能這樣做。你可以做的是創建一個輔助方法並調用它。

var qClients = 
    from client in xdoc.Root.Element(XKey.clients).Elements(XKey.client) 
    // client object 
    select ClientXmlToExpandoObject(client); 

助手可能看起來像

public dynamic ClientXmlToExpandoObject(System.Xml.Linq.XElement client) 
{ 
    dynamic result = new ExpandoObject(); 
    result.OnlineDetails = new 
     { 
      Password = client.Element(XKey.onlineDetails). 
       Element(XKey.password).Value, 
      Roles = client.Element(XKey.onlineDetails). 
       Element(XKey.roles).Elements(XKey.roleId). 
       Select(xroleid => xroleid.Value) 
      // More online detail fields TBD 
     }; 
    return result; 
}