es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo definir un comportamiento para cada inserción en un diccionario en C#? Por ejemplo, escribir en el registro cada inserción.

Tengo una clase que contiene un campo de tipo Dictionary.
Me gustaría registrar cada inserción en el diccionario.
¿Cuál es la forma más elegante de hacerlo?

Intenté definir una propiedad del diccionario y poner el registro en el método set:

private Dictionary<string, string=""> _myDictionary = new Dictionary<string, string="">();

private Dictionary<string, string=""> MyDictionary
{
    get
    {
        return _myDictionary;
    }
    set
    {
        _logger.Trace($"MyDictionary.set: value = {value}");

        _myDictionary = value;
    }
}

Pero esto no es relevante para una inserción, solo para una asignación de referencia al diccionario.
Me gustaría “capturar” el establecimiento de una clave-valor como en la siguiente operación, y registrarlo:

MyDictionary["key"] = "some value";

¿Cómo puedo hacerlo?</string,></string,></string,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una solución sería crear una clase de diccionario personalizada que herede de Dictionary y anule los métodos Add y AddRange. Dentro de esos métodos, puedes registrar las inserciones antes de invocar la implementación de la clase base. Aquí tienes un ejemplo de implementación:

    public class LoggingDictionary<tkey, tvalue=""> : Dictionary<tkey, tvalue="">
    {
        private readonly ILogger _logger;
    
        public LoggingDictionary(ILogger logger)
        {
            _logger = logger;
        }
    
        public new void Add(TKey key, TValue value)
        {
            _logger.Trace($"Añadiendo '{key}:{value}' al diccionario");
            base.Add(key, value);
        }
    
        public new void AddRange(IEnumerable<><tkey, tvalue="">> collection)
        {
            foreach (var kvp in collection)
            {
                _logger.Trace($"Añadiendo '{kvp.Key}:{kvp.Value}' al diccionario");
            }
    
            base.AddRange(collection);
        }
    }
    

    Luego puedes usar esta clase en lugar del Dictionary estándar en tu código:

    private LoggingDictionary<string, string=""> _myDictionary = new LoggingDictionary<string, string="">(logger);
    
    _myDictionary.Add("key1", "value1");
    _myDictionary.AddRange(new Dictionary<string, string="">
    {
        { "key2", "value2" },
        { "key3", "value3" }
    });
    

    Esto registrará las inserciones en el diccionario usando el ILogger proporcionado. Ten en cuenta que si necesitas registrar la modificación de un par clave-valor existente (es decir, MyDictionary["key"] = "nuevo valor"), también deberás anular la propiedad this[TKey key].</string,></string,></string,></tkey,></tkey,></tkey,>

Comments are closed.