2011-03-01 6 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のいずれかを使用して終了:

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; 
} 
0

クールな解決策があるようなもの、DynamicXmlに見えるかもしれません。後発のためにここにコードサンプルをコピーしました。クエリ構文ではなく、生のクラスを使用します。

// 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; 
     }); 
関連する問題