.net - 有没有办法创建一个不变的(只读)XDocument?

标签 .net api linq-to-xml xelement

我有一个返回 XElement 的API,并且我希望这些XElement后面的文档是不可变的(只读)。我需要它用于:

  • 不要让开发人员意外更改它:)
  • 提高性能-在某些情况下,创建XDocument的副本可能是性能上的“沉重”操作。

  • 似乎不可能继承并覆盖XDocument/XElement/XContainer中的必要行为,因为那里的所有虚拟方法都标记为internal:
    internal virtual void XContainer.AddAttribute(XAttribute a)
    {
    }
    

    所以我的问题是-有没有办法实现它,还是最好有一个不同的API,要么返回类似XPathNavigator的东西,要么拥有自己的类,比如IReadOnlyXElement等,这更好?

    最佳答案

    您可以创建一个类似于XElementReadOnlyCollection<T>包装器。

    public sealed class ReadOnlyXElement
    {
        private readonly XElement _element;
    
    
        public string Value
        {
            get { return _element.Value; }
        }
    
    
        public ReadOnlyXElement(XElement element)
        {
            _element = element;
        }
    
    
        public IEnumerable<ReadOnlyXElement> Elements()
        {
            foreach (var child in _element.Elements())
            {
                yield return new ReadOnlyXElement(child);
            }
        }
    
        public IEnumerable<ReadOnlyXElement> Elements(XName xname)
        {
            foreach (var child in _element.Elements(xname))
            {
                yield return new ReadOnlyXElement(child);
            }
        }
    }
    

    关于.net - 有没有办法创建一个不变的(只读)XDocument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3585120/

    相关文章:

    c# - 是否可以将不相关的锁定语句之后的读取指令移动到锁定之前?

    c# - 提高使用 .NET 枚举文件和文件夹的性能

    c# - 当async block并发数大于1时,抛出异常怎么办?

    api - Spotify 是否为其 Spotify "Play Button"嵌入提供 oEmbed API 端点?

    api - 适用于 onhub 的 Google API

    reflection - Automapper 与运行时通过配置文件和反射进行映射

    c# - 将窗口置于前台的问题

    api - 如何从 RPG 程序创建新的文件成员?

    c# - 在这种情况下我将如何使用 LINQ2XML?

    .net - 如何使用 LINQ to XML 读取/写入加密的 XML 文件?