Dmi*_*gin 9 .net api xelement linq-to-xml
我有一个返回XElement's 的API,我希望这些文件背后的文档XElement是不可变的(只读).我需要它:
XDocument在某些情况下,创建一个可能是性能"繁重"操作的副本.似乎无法继承和覆盖XDocument/ XElement/中的必要行为 XContainer,因为所有虚拟方法都标记为internal:
internal virtual void XContainer.AddAttribute(XAttribute a)
{
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是 - 有没有办法让它发生,或者最好有一个不同的API,它会返回类似的东西XPathNavigator,或者最好有自己的类IReadOnlyXElement,等等?
Sly*_*Sly 12
我怀疑autor还在等待答案,但也许其他人会发现它很有用.
您可以通过使用其Changing事件使XDocument不可变:
class Program
{
static void Main(string[] args)
{
var xdoc = XDocument.Parse("<foo id=\"bar\"></foo>");
xdoc.Changing += (s, ev) =>
{
throw new NotSupportedException("This XDocument is read-only");
};
try
{
xdoc.Root.Attribute("id").Value = "boo";
}
catch (Exception e)
{
Console.WriteLine("EXCEPTION: " + e.Message);
}
Console.WriteLine("ID on exit: " + xdoc.Root.Attribute("id").Value);
Console.ReadKey();
}
}
// Console output:
// EXCEPTION: This XDocument is read-only
// ID on exit: bar
Run Code Online (Sandbox Code Playgroud)
不是最好的解决方案,但它确实提供了防止意外更改的基本机制.
您可以创建一个XElement类似于ReadOnlyCollection<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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1339 次 |
| 最近记录: |