5

ExpandoObject为了简洁起见,我可以在 LINQ to XML 查询中使用 初始化语法吗?

注意:查询的结果旨在传递到当前程序集范围之外,因此匿名类型是不可能的(请参阅此处的原因)。

我正在尝试使用如下的简短语法来创建动态/扩展对象:

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

使此代码工作的更多涉及的解决方案可能是:

  • 创建具体类并改为初始化它(但我不想创建一堆)。
  • 使用匿名类型并将其成员复制到动态对象(有些多余)并返回动态对象

是否有同样短的语法来实现我打算通过有问题的错误代码执行的操作,或者我是否必须以某种方式扩展代码库以获得所需的结果?

4

3 回答 3

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;
}
于 2011-03-01T20:00:58.040 回答
0

我最终使用了Jon Skeet 的一个相关问题的代码答案。此处复制的代码示例以供后代使用。它使用原始类而不是查询语法。

// 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; 
       });
于 2011-03-01T21:35:18.950 回答
0

这是很酷的解决方案,DynamicXml:http: //blogs.captechconsulting.com/blog/kevin-hazzard/fluent-xml-parsing-using-cs-dynamic-type-part-1

于 2011-03-01T20:03:41.227 回答