У меня есть API, который возвращает XElement
, и я хочу, чтобы документ за этими XElement
был неизменным (только для чтения). Мне это нужно для:
XDocument
может быть «тяжелой» операцией в некоторых случаях. Кажется невозможным наследовать и переопределять необходимое поведение в XDocument
/ XElement
/ XContainer
, потому что все виртуальные методы там помечены как internal
:
internal virtual void XContainer.AddAttribute(XAttribute a)
{
}
Итак, мой вопрос - есть ли способ сделать это, или лучше иметь другой API, который либо будет возвращать что-то вроде XPathNavigator
, или лучше иметь собственные классы, такие как IReadOnlyXElement
и т. д .?
Вы можете создать оболочку 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);
}
}
}
ИМХО, возможно, лучше создать собственный класс-оболочку для взаимодействия с XDocuments/XElements. Затем вы можете ограничить возможность разработчика перезаписывать файл в коде.
Я говорю ограничение, потому что при наличии достаточной информации (местоположение, схема (при необходимости)) разработчик может использовать стандартные XML-классы, чтобы делать все, что захочет. Конец всего будет заключаться в том, чтобы сделать файл доступным только для чтения на диске и убедиться, что у них (разработчиков, пользователей) нет разрешения на изменение доступа только для чтения к файлу.