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.

Cargar propiedad byte[] de la clase solo cuando sea necesario.

Tengo una clase que devuelve una List que está vinculada a una cuadrícula. Una de mis propiedades es una matriz byte[] que solo debería llenarse si alguien hace doble clic en la celda en la cuadrícula con el archivo. En ese momento, el archivo debería descargarse y presentarse al usuario. Solo un evento con un nombre de archivo y Process.Start(…

Debido a que estoy vinculando la lista a la cuadrícula, se llama a la propiedad “File” y se llena el valor dándole un comportamiento de tipo ansioso en lugar del comportamiento de tipo perezoso que estoy buscando.

¿Hay alguna forma de evitar que esta propiedad llene la clase de datos (a continuación) sin tener que modificar una cuadrícula de nivel de interfaz de usuario para que explícitamente no lea la columna del archivo?

public class Errors
{
//…
private bool hasFile;
public bool HasFile { get { return HasFile; } }
private byte[] file;
public byte[] File
{
get
{
if (HasFile) { file = FileHelper.DownloadAndDecompress(this.ID, “ErrorsDownloadFile”); }
return file;
}
set { file = value; }
}

public static List<errors> FindByAppName(string AppName, DateTime StartDate, DateTime EndDate) {/*...*/}
//...

}

He estado leyendo sobre Lazy, pero me está resultando difícil implementarlo en mi flujo de trabajo habitual, ya que cuando lo implemento, no puedo asignar al setter el valor para cargar archivos…

Intento, pero no puedo asignar un byte[] a la propiedad File ya que es de solo lectura…

public bool HasFile { get { return HasFile; } }
public Lazy<byte[]> File
{
get
{
if (HasFile) { return new Lazy<byte[]>(() => FileHelper.DownloadAndDecompress(this.ID, “ErrorsDownloadFile”)); }
else { return null; };
}
set { }
}

Cualquier consejo sobre cómo implementar correctamente una propiedad perezosa utilizando Lazy u otro método sería muy apreciado.</byte[]></byte[]>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para implementar la carga diferida (lazy-loading) para la propiedad File en la clase Errors, puedes cambiar el tipo de la propiedad de byte[] a Lazy<byte[]>. Luego, en el método getter de la propiedad File, puedes usar Lazy<t> para retrasar la carga del archivo hasta que sea realmente accedido.

    Así es como puedes modificar la clase Errors para implementar la carga diferida:

    public class Errors
    {
        //...
        private bool hasFile;
        public bool HasFile { get { return hasFile; } }
        private Lazy<byte[]> file;
        public Lazy<byte[]> File
        {
            get
            {
                if (!hasFile) { return null; }
                file = file ?? new Lazy<byte[]>(() => FileHelper.DownloadAndDecompress(this.ID, "ErrorsDownloadFile"));
                return file;
            }
        }
    
        public static List<errors> FindByAppName(string AppName, DateTime StartDate, DateTime EndDate) {/*...*/}
        //...
    }
    

    En la implementación modificada, la propiedad File es de tipo Lazy<byte[]>. En el método getter, si hasFile es false, se devuelve un valor nulo. De lo contrario, si el campo file es nulo, se le asigna una nueva instancia de Lazy<byte[]> inicializada con una expresión lambda que carga el archivo. Por último, se devuelve el campo file.

    Para usar la propiedad File, necesitas hacer algunos cambios en tu código consumidor. En lugar de acceder directamente a la propiedad File, necesitas acceder a su propiedad Value para iniciar la carga diferida. Aquí tienes un ejemplo:

    var errors = Errors.FindByAppName("miApp", startTime, endTime);
    foreach (var error in errors)
    {
        // ...
        if (doubleClickedOnFileCell)
        {
            var bytes = error.File?.Value; // Acceder a la propiedad Value para iniciar la carga diferida
            if (bytes != null)
            {
                File.WriteAllBytes(fileName, bytes);
                Process.Start(fileName);
            }
        }
    }
    

    En el ejemplo, se accede a la propiedad File con el operador de condicional nulo (?.) para manejar el caso en el que File sea nulo. Se accede a la propiedad Value para iniciar la carga diferida, y el arreglo de bytes resultante se guarda en un archivo y se abre con Process.Start.</byte[]></byte[]></byte[]></byte[]></byte[]></byte[]>

Comments are closed.