10

を返すAPIがあり、XElementそれらの背後にあるドキュメントをXElement不変(読み取り専用)にする必要があります。私はそれが必要です:

  • 開発者に誤って変更する機能を与えないでください:)
  • パフォーマンスの向上-のコピーを作成するXDocumentと、パフォーマンスが「重い」操作になる場合があります。

XDocument//で必要な動作を継承XElementおよびオーバーライドすることはできないようです。これは、 XContainerそこにあるすべての仮想メソッドが次のようにマークされているためinternalです。

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

だから私の質問は-それを実現する方法はありますか、それとも'sのようなものを返す別のAPIを持っている方がXPathNavigator良いですか、それともなどのような独自のクラスを持っている方が良いIReadOnlyXElementですか?

4

3 に答える 3

12

autorがまだ答えを待っているとは思えませんが、おそらく他の誰かがそれを役立つと思うでしょう。

変更イベントを使用して、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

最高のソリューションではありませんが、偶発的な変更を防ぐ基本的なメカニズムを提供します。

于 2012-06-14T16:39:01.130 に答える
5

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);
        }
    }
}
于 2010-08-27T14:34:58.160 に答える
3

私見ですが、XDocuments/XElementsと対話するための独自のラッパークラスを作成する方がおそらく良いでしょう。次に、開発者がファイルをコードで上書きする機能を制限できます。

十分な情報(場所、スキーマ(必要な場合))があれば、開発者はストックXMLClassesを使用して、必要なことを何でも実行できるため、制限と言います。最終的には、ファイルをディスク上で読み取り専用にし、ファイルの読み取り専用アクセスを変更する権限がユーザー(開発者、ユーザー)にないことを確認します。

于 2010-08-27T14:38:00.180 に答える