2012-07-20 23 views
15

¿Cómo se define un getter y setter para tipos de datos complejos, como un diccionario?¿Cómo escribir un getter y setter para un Dictionary?

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

    set 
    { 
     m_Users = value; 
    } 
} 

¿Devuelve todo el diccionario? ¿Puede escribir el colocador para observar si existe un par clave-valor específico y luego, si no lo tiene, agregarlo? ¿Otra actualización del par de valor clave actual? Para obtener, ¿puede devolver un par clave-valor específico en lugar de todo el diccionario?

+2

Usar una propiedad de indizador. Ver http://msdn.microsoft.com/en-us/library/aa288464(VS.71).aspx –

+0

Gracias por las respuestas. Ahora sé las opciones que tengo. Prefiero crear métodos get y set, en lugar de usar un indexador. – Mausimo

Respuesta

16

No es posible hacerlo de una manera que implicaría únicas propiedades. Usted teóricamente podría escribir un setter, pero para un getter, necesitaría especificar una clave que desea recuperar. Eso es imposible ya que las propiedades no aceptan parámetros. forma natural para lograr lo que desea sería utilizar métodos:

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; 
} 

Por otra parte, como ya se ha dicho, se puede usar controladores paso a paso, pero yo siempre los he encontrado un poco engorroso. Pero supongo que es solo una cuestión de preferencia personal.

Y sólo por la mayor abundamiento, es así como un regulador podría ser similar, aunque es altamente inusual y contrario a la intuición para tener una propiedad:

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

Internamente, se utiliza el método Set de mi fragmento anterior

+2

Vale la pena señalar que técnicamente puede usar una propiedad para establecer valores (solo tiene la propiedad de tipo 'keyvaluepair'). Simplemente no podría usar un 'get'ter para obtener el valor (o par) de una clave ya que no puede especificar una clave. – Servy

+0

Podría usar una propiedad del indexador, no necesita un método, per se .... –

+0

@Servy Por supuesto, * técnicamente *, podrías, pero sería bastante antinatural. –

1

Usted no será capaz de hacer eso con una propiedad. Tendrá que usar métodos para eso, o agregar un indexador a su clase. El método get no puede aceptar un parámetro (la clave).

Otra opción, si desea que alguien pueda agregar/eliminar fácilmente las claves del diccionario, pero evitar que configuren una completamente nueva sería convertir la propiedad en una propiedad de solo lectura que devuelve un diccionario creado en el constructor. Sería menos flexible que agregar métodos get/set, pero en casos comunes y simples, puede funcionar bien.

+1

+1 indexer es probablemente lo que él quiere –

+0

Hay formas de hacer lo que quiere. Simplemente no directamente. – Ani

0

Parece que desea un "paso a paso llamado". Aquí está (mi) one manera de lograr eso usando C#.

Mi enfoque expone una propiedad que devuelve un objeto (con un indexador por defecto) que llevará a cabo la indexación en el campo apropiado dadas las lambdas de hacerlo.

Hay razones por las que puede o no desea utilizar este método, pero lo dejo a ti. :)

+2

¿Por qué no usar un indizador directamente? –

+0

Porque puedo tener varios indizadores en una clase que toma los mismos tipos de parámetros. Niños [int index] y Customers [int index]. Además, el caso de uso del OP muestra el uso de un nombre como en obj.Foo [...], not obj [...] – Ani

0

Es es posible hacerlo con el colocador pero muy desaconsejado, y es completamente imposible con el captador, ya que no requiere ningún parámetro para determinar qué obtener.

Para el colocador, debe pasar un Dictionary<string, string> con un solo par, pero va en contra de lo que cabría esperar que el eliminador/colocador usualmente lo haga y le impide completamente configurar todo el Diccionario.

Una manera mucho mejor es usar un par de métodos que se pueden nombrar obtener y definir si así lo desea.

22

Utilice una propiedad indexador (MSDN):

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; } 
    } 
} 

A continuación, utilice como:

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

¡Bueno! Pero como dijo Nicola Anusev, al establecer la propiedad, debe verificar si ya existe con '_yourDictionary.ContaineKey (key)'. Y si ot no existe, debe configurarlo con 'yourDictionary.Add (clave, valor)' – Yoone

+1

Esto solo funcionará si la clase no es estática, podría querer pensar en una alternativa para una clase estática ... – 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; 
} 
Cuestiones relacionadas