Cargar propiedad byte[] de la clase solo cuando sea necesario.
Tengo una clase que devuelve una List
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
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
davy.ai
Para implementar la carga diferida (lazy-loading) para la propiedad
File
en la claseErrors
, puedes cambiar el tipo de la propiedad debyte[]
aLazy<byte[]>
. Luego, en el método getter de la propiedadFile
, puedes usarLazy<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:En la implementación modificada, la propiedad
File
es de tipoLazy<byte[]>
. En el método getter, sihasFile
esfalse
, se devuelve un valor nulo. De lo contrario, si el campofile
es nulo, se le asigna una nueva instancia deLazy<byte[]>
inicializada con una expresión lambda que carga el archivo. Por último, se devuelve el campofile
.Para usar la propiedad
File
, necesitas hacer algunos cambios en tu código consumidor. En lugar de acceder directamente a la propiedadFile
, necesitas acceder a su propiedadValue
para iniciar la carga diferida. Aquí tienes un ejemplo:En el ejemplo, se accede a la propiedad
File
con el operador de condicional nulo (?.
) para manejar el caso en el queFile
sea nulo. Se accede a la propiedadValue
para iniciar la carga diferida, y el arreglo de bytes resultante se guarda en un archivo y se abre conProcess.Start
.</byte[]></byte[]></byte[]></byte[]></byte[]></byte[]>