2012-07-20 12 views
15

Wie definieren Sie einen Getter und Setter für komplexe Datentypen wie ein Wörterbuch?Wie schreibe ich einen Getter und Setter für ein Wörterbuch?

public Dictionary<string, string> Users 
{ 
    get 
    { 
     return m_Users; 
    } 

    set 
    { 
     m_Users = value; 
    } 
} 

Dies gibt das gesamte Wörterbuch zurück? Können Sie den Setter schreiben, um zu sehen, ob ein bestimmtes Schlüssel-Wert-Paar existiert und dann, wenn es nicht existiert, fügen Sie es hinzu. Sonst aktualisiere das aktuelle Schlüsselwertpaar? Können Sie anstelle des gesamten Wörterbuchs ein bestimmtes Schlüssel/Wert-Paar zurückgeben?

+2

Verwenden Sie einen Indexer Eigenschaft. Siehe http://msdn.microsoft.com/en-us/library/aa288464(VS.71).aspx –

+0

Danke für die Antworten. Jetzt kenne ich die Möglichkeiten, die ich habe. Ich bevorzuge das Erstellen und Festlegen von Methoden, anstatt einen Indexer zu verwenden. – Mausimo

Antwort

16

Es ist nicht möglich, dies nur mit Eigenschaften zu tun. Sie theoretisch könnte einen Setter schreiben, aber für einen Getter müssen Sie einen Schlüssel angeben, den Sie abrufen möchten. Das ist unmöglich, da Eigenschaften keine Parameter akzeptieren. Natürliche Art und Weise zu erreichen, was Sie wollen, wäre Methoden zu verwenden:

private Dictionary<string, string> users = new Dictionary<string, string>(); 

public void Set(string key, string value) 
{ 
    if (users.ContainsKey(key)) 
    { 
     users[key] = value; 
    } 
    else 
    { 
     users.Add(key, value); 
    } 
} 

public string Get(string key) 
{ 
    string result = null; 

    if (users.ContainsKey(key)) 
    { 
     result = users[key]; 
    } 

    return result; 
} 

Alternativ kann, wie andere schon gesagt haben, Sie Indexer verwenden könnte, aber ich habe immer fand sie ein wenig umständlich. Aber ich denke, es ist nur eine Frage der persönlichen Vorlieben.

Und nur aus Gründen der Vollständigkeit, das ist wie ein Setter aussehen könnte, obwohl es höchst ungewöhnlich und kontraintuitiv ist eine solche Eigenschaft zu haben:

public KeyValuePair<string, string> Users 
{ 
    set 
    { 
     Set(value.Key, value.Value); 
    } 
} 

Intern verwendet es die Set Methode aus mein vorheriger Ausschnitt.

+2

Es ist erwähnenswert, dass Sie technisch eine Eigenschaft verwenden können, um Werte festzulegen (haben Sie einfach die Eigenschaft des Typs 'Schlüsselvaluepaar'). Sie können einfach keinen 'get'ter verwenden, um den Wert (oder das Paar) für einen Schlüssel zu erhalten, da Sie keinen Schlüssel angeben können. – Servy

+0

Könnte eine Indexer-Eigenschaft verwenden, braucht keine Methode per se .... –

+0

@Servy Natürlich * technisch * könnte man, aber es wäre ziemlich unnatürlich. –

1

Sie können dies nicht mit einer Eigenschaft tun. Sie müssen Methoden dafür verwenden oder einen Indexer zu Ihrer Klasse hinzufügen. Die Methode get kann einen Parameter (den Schlüssel) nicht akzeptieren.

Eine andere Option, wenn Sie möchten, dass jemand Schlüssel zum Wörterbuch leicht hinzufügen/entfernen kann, aber verhindern, dass sie eine völlig neue setzen, würde die Eigenschaft eine schreibgeschützte Eigenschaft sein, die ein in der Konstrukteur. Es wäre weniger flexibel als das Hinzufügen von get/set-Methoden, aber im Allgemeinen, einfache Fälle kann es gut tun.

+1

+1 Indexer ist wahrscheinlich, was er will –

+0

Es gibt Möglichkeiten zu tun, was er will. Nur nicht direkt. – Ani

0

Es sieht so aus, als ob Sie einen "benannten Indexer" möchten. Hier ist (meine) one Weg, um das mit C# zu erreichen.

Mein Ansatz macht eine Eigenschaft verfügbar, die ein Objekt (mit einem Standardindexer) zurückgibt, das die Indexierung in das entsprechende Feld durchführt, wenn die Lambdas dies tun.

Es gibt Gründe, warum Sie diese Methode verwenden möchten oder nicht, aber ich überlasse das Ihnen. :)

+2

Warum nicht einfach einen Indexer direkt verwenden? –

+0

Da ich möglicherweise mehrere Indexer für eine Klasse haben, die die gleichen Parametertypen verwenden. Kinder [int index] und Kunden [int index]. Auch der Anwendungsfall des OP zeigt die Verwendung eines Namens wie in obj.Foo [...], nicht obj [...] – Ani

0

Es ist ist möglich, dies mit dem Setter zu tun, aber sehr unrecomended, und ist völlig unmöglich mit dem Getter, da es keine Parameter zu bestimmen, was zu bekommen.

Für den Setzer müssten Sie einen Dictionary<string, string> mit einem einzigen Paar übergeben, aber es geht gegen das, was Sie erwarten würden, dass der Getter/Setter in der Regel tun und stoppt Sie vollständig einstellen das gesamte Wörterbuch.

Ein viel besserer Weg ist, ein Paar Methoden zu verwenden, die Sie Get und Set nennen können, wenn Sie dies wünschen.

22

einen Indexer Eigenschaft (MSDN) Verwendung:

public class YourClass 
{ 
    private readonly IDictionary<string, string> _yourDictionary = new Dictionary<string, string>(); 

    public string this[string key] 
    { 
     // returns value if exists 
     get { return _yourDictionary[key]; } 

     // updates if exists, adds if doesn't exist 
     set { _yourDictionary[key] = value; } 
    } 
} 

Dann wie verwenden:

var test = new YourClass(); 
test["Item1"] = "Value1"; 
+0

Gut! Aber wie von Nicola Anusev gesagt, sollten Sie beim Setzen der Eigenschaft prüfen, ob es bereits mit '_yourDictionary.ContaineKey (key)' existiert. Und wenn ot nicht existiert, sollten Sie es mit 'yourDictionary.Add (Schlüssel, Wert) setzen' – Yoone

+1

Dies funktioniert nur, wenn die Klasse nicht statisch ist, könnte eine Alternative für eine statische Klasse denken ... – TGarrett

0
Dictionary<string, string> param = new Dictionary<string, string>(); 

public void SetYourParameter(string parametrName, string paramValue) 
{ 
    param[parametrName] = paramValue;    
} 

public string GetYourParameter(string parametrName) 
{ 
    // ContainKey ---> It returns value if the key was found 
    if(param.ContainsKey(parametrName)) 
     return param[parametrName]; 
    else 
     return null; 
}