Есть ли способ создать неизменяемый (читайте только для XDocument?

У меня есть API, который возвращает XElement , и я хочу, чтобы документ за этими XElement был неизменным (только для чтения). Мне это нужно для:

  • Чтобы не дать разработчикам возможность случайно изменить его:)
  • Повышение производительности - создание копии XDocument может быть «тяжелой» операцией в некоторых случаях.

Кажется невозможным наследовать и переопределять необходимое поведение в XDocument / XElement / XContainer , потому что все виртуальные методы там помечены как internal :

internal virtual void XContainer.AddAttribute(XAttribute a)
{
}

Итак, мой вопрос - есть ли способ сделать это, или лучше иметь другой API, который либо будет возвращать что-то вроде XPathNavigator , или лучше иметь собственные классы, такие как IReadOnlyXElement и т. д .?

9
задан mak 8 April 2013 в 14:08
поделиться

2 ответа

Вы можете создать оболочку XElement, аналогичную ReadOnlyCollection.

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);
        }
    }
}
4
ответ дан 4 December 2019 в 11:02
поделиться

ИМХО, возможно, лучше создать собственный класс-оболочку для взаимодействия с XDocuments/XElements. Затем вы можете ограничить возможность разработчика перезаписывать файл в коде.

Я говорю ограничение, потому что при наличии достаточной информации (местоположение, схема (при необходимости)) разработчик может использовать стандартные XML-классы, чтобы делать все, что захочет. Конец всего будет заключаться в том, чтобы сделать файл доступным только для чтения на диске и убедиться, что у них (разработчиков, пользователей) нет разрешения на изменение доступа только для чтения к файлу.

3
ответ дан 4 December 2019 в 11:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: