Frage

Ich habe eine Klasse in C #, die ein Wörterbuch enthält, die ich will nichts schaffen und sicherzustellen, wie hinzugefügt, bearbeitet oder aus diesem Wörterbuch, solange die Klasse entfernt, die enthält es vorhanden ist.

Nur-Lese nicht wirklich helfen, wenn ich getestet und sah, dass ich Artikel nach hinzufügen. Nur zum Beispiel, habe ich ein Beispiel:

public class DictContainer
{
    private readonly Dictionary<int, int> myDictionary;

    public DictContainer()
    {
        myDictionary = GetDictionary();
    }

    private Dictionary<int, int> GetDictionary()
    {
        Dictionary<int, int> myDictionary = new Dictionary<int, int>();

        myDictionary.Add(1, 2);
        myDictionary.Add(2, 4);
        myDictionary.Add(3, 6);

        return myDictionary;
    }

    public void Add(int key, int value)
    {
        myDictionary.Add(key, value);
    }

}

Ich möchte die Add-Methode nicht funktionieren. Wenn möglich, möchte ich es nicht selbst kompilieren. Irgendwelche Vorschläge?

Eigentlich bin ich besorgt für sie ist Code, der für viele Menschen offen sein zu ändern. Also, auch wenn ich die Add-Methode verbirgt, wird es möglich sein, für jemand, der „unschuldig“, um eine Methode zu erstellen, die einen Schlüssel hinzufügen oder eine andere entfernen. Ich möchte den Menschen schauen und wissen, dass sie nicht das Wörterbuch in jeder Hinsicht ändern sollte. Genau wie ich mit einem const-Variable.

War es hilfreich?

Lösung

Es gibt nichts in .NET Framework Sie hier, um zu helfen, aber diesen Beitrag eine ziemlich gute Umsetzung eines generischen ReadOnlyDictionary in C # gibt. Es implementiert alle Schnittstellen, die Sie könnte es erwarten (IDictionary, ICollection, IEnumerable, etc.) und als Bonus, die ganze Klasse und ihre Mitglieder sind mit XML vollständig kommentiert.

(Ich habe zu veröffentlichen den Code hier verzichtet, weil es wirklich ziemlich lang mit allen XML-Kommentaren.)

Andere Tipps

Wie bitte vollständig das Wörterbuch. Geben Sie einfach eine get-Methode auf der DictContainer Klasse, die Elemente aus dem Wörterbuch abgerufen werden.

public class DictContainer
{
    private readonly Dictionary<int, int> myDictionary;

    public DictContainer()
    {
        myDictionary = GetDictionary();
    }

    private Dictionary<int, int> GetDictionary()
    {
        Dictionary<int, int> myDictionary = new Dictionary<int, int>();

        myDictionary.Add(1, 2);
        myDictionary.Add(2, 4);
        myDictionary.Add(3, 6);

        return myDictionary;
    }

    public this[int key]
    {
        return myDictionary[key];
    }
}

Eh ... dann nicht definieren, die Add-Methode ...

Halten Sie die myDictionary Variable private und setzt einen Getter / Indexer, so dass es nur von außen dieser Klasse gelesen werden kann ..

fragt sich, ob er den Punkt vollständig fehlt

Es gibt keine integrierte Möglichkeit, das zu tun, sollten Sie mit einem Wrapper-Klasse.

interface IReadOnlyDic<Key, Value>
{
    void Add(Key key, Value value);
}
class ReadOnlyDic<Key, Value> : Dictionary<Key, Value>, IReadOnlyDic<Key, Value>
{
    public new void Add(Key key, Value value)
    {
        //throw an exception or do nothing
    }
    #region IReadOnlyDic<Key,Value> Members

    void IReadOnlyDic<Key, Value>.Add(Key key, Value value)
    {
        base.Add(key, value);
    }

    #endregion
}

benutzerdefinierte Elemente hinzuzufügen;

    IReadOnlyDic<int, int> dict = myDictInstance as IReadOnlyDic<int, int>;
    if (dict != null)
        dict.Add(1, 155);

und das ist eine andere Art und Weise

class ReadOnlyDic<Key, Value> : Dictionary<Key, Value>
{
    private bool _locked = false;

    public new void Add(Key key, Value value)
    {
        if (!_locked)
        {
            base.Add(key, value);
        }
        else
        {
            throw new ReadOnlyException();
        }
    }
    public void Lock()
    {
        _locked = true;
    }
}

Ich mochte den Link bruno-conde , die ein einfacheres, war aber sobald ich seine Bemerkung als Antwort nicht markieren ich werde Noldorin Antwort als offizielle markieren, denn es ist eine ähnliche und befriedigende Antwort ist.

Schade, es gibt keine Möglichkeit, den Code kompilieren :( zu verhindern. Danke, Jungs

Hier ist eine bessere Alternative als ich beschrieben habe:

http://www.softwarerockstar.com/2010/10/ ..

Im Wesentlichen ist es eine viel einfachere Lösung Subklassifizieren Readonlycollection, die die Arbeit in einer eleganteren Weise durchgeführt wird.

FYI, jetzt ist es ist eingebaut in 4,5 bis .net.

http://msdn.microsoft.com /en-us/library/gg712875(v=vs.110).aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top