C# 实现从LINQ到XML select查询的动态对象的捷径?

C# 实现从LINQ到XML select查询的动态对象的捷径?,c#,.net,linq-to-xml,initialization,expandoobject,C#,.net,Linq To Xml,Initialization,Expandoobject,是否有一个ExpandoObject的初始化语法,我可以在LINQ到XML查询中使用它以达到简洁的目的 注意:查询结果将在当前程序集的范围之外传递,因此匿名类型是不可能的() 我尝试使用以下简短语法来创建dynamic/expando对象: public IEnumerable<dynamic> ParseUserXml(string strXmlUser) { var qClients = from client in xdoc.Root.Element(XKey.cli

是否有一个
ExpandoObject
的初始化语法,我可以在LINQ到XML查询中使用它以达到简洁的目的

注意:查询结果将在当前程序集的范围之外传递,因此匿名类型是不可能的()

我尝试使用以下简短语法来创建dynamic/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;
        }
public IEnumerable ParseUserXml(字符串strXmlUser){
var qClients=
从xdoc.Root.Element(XKey.clients.Elements)(XKey.client)中的客户端
//客户端对象
//我无法使ExpandoObject初始化内联
选择new ExpandooObject(){//尝试初始化语法,编译错误
OnlineDetails=新
{
密码=client.Element(XKey.onlineDetails)。
元素(XKey.password).Value,
角色=client.Element(XKey.onlineDetails)。
元素(XKey.roles).Elements(XKey.roleId)。
选择(xroleid=>xroleid.Value)
//更多在线详细信息字段待定
},
//等等。。。。
//通过IEnumerable返回动态对象。。。
foreach(qClients中的var客户端)
{
收益型客户;
}
要使此代码正常工作,更复杂的解决方案可能是:

  • 创建具体的类并初始化它(但我不想创建一堆这样的类)
  • 使用匿名类型并将其成员复制到动态对象(有些冗余),然后返回动态对象

是否有一个同样简短的语法来实现我对所讨论的错误代码的意图,或者我必须以某种方式扩展代码库以获得所需的结果?

不幸的是,我认为您无法做到这一点。您可以做的是创建一个helper方法并调用它

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

这是一个很酷的解决方案,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; 
       });