c# - 实现动态对象从LINQ to XML select查询的捷径?

标签 c# .net linq-to-xml initialization expandoobject

是否有 ExpandoObject 的初始化语法,我可以在 LINQ to XML 查询中使用它以实现简洁目的?

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

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

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

使此代码正常工作的更复杂的解决方案可能是:

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

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

最佳答案

很遗憾,我认为您无法做到这一点。您可以做的是创建一个辅助方法并调用它。

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

关于c# - 实现动态对象从LINQ to XML select查询的捷径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5159433/

相关文章:

c# - 如何抑制 StyleCop 警告 SA1403?

c# - 如何获取 IQueryable<T> 扩展方法而不是 IEnumerable<T> 扩展?

javascript - 是否可以控制 HTML Razor 组件呈现的顺序?

xml - 我如何在 linq to xml 中使用 "like"

c# - 使用 TreeView 在 WPF 中获取 XML 属性

c# - 更有效地过滤 XDocument

C#性能分析——如何统计CPU周期?

c# - C# 中静态构造函数的潜在缺陷

c# - 如何使用 FTP 获取基于模式匹配的文件列表?

c# - 使用 "greater than or equals"或仅使用 "greater than"