仅在需要时加载 byte[] 属性 of Class
Load byte[] Property of Class Only When Needed
我有一个 class returns 一个绑定到网格的列表。我的 属性 之一是一个 byte[] 数组,只有当有人双击带有文件的网格单元格中的单元格时,它才应该被填充。此时,应该下载该文件并呈现给用户。只是一个带有文件名和 Process.Start(...
因为我将列表绑定到网格,它正在调用“文件”属性 并填充值,使其具有 eager 类型的行为,而不是我正在寻找的 lazy 行为。
有什么方法可以阻止这个 属性 填写数据 class(下),而不必修改 UI 级别网格以明确不读取文件列?
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) {/*...*/}
//...
}
我阅读了一些关于 Lazy<T>
的内容,但是,我正在努力将其纳入我的常规工作流程,因为当我实施它时,我无法将要执行的值分配给 setter文件上传...
尝试,但我无法将字节[]分配回文件 属性,因为它是只读的...
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 { }
}
任何有关如何使用 Lazy<T>
或其他方法正确实现惰性 属性 的提示,我们将不胜感激。
如果我没理解错的话,你想实现 lazy 下载,但是 eager 上传
// Eager download (will be used in lazy download)
private byte[] DownLoad() {
// download here:
return FileHelper.DownloadAndDecompress(this.ID, "ErrorsDownloadFile");
}
// Lazy download ...
private Lazy<byte[]> m_File;
// ... which we assign in the constructor
public MyClass() {
...
m_File = new Lazy<byte[]>(Download);
...
}
// Our property
public byte[] File {
get {
// Lazy download
return m_File.Value;
}
set {
// we can't assign m_File.Value but we can recreate m_File
m_File = new Lazy<byte[]>(value);
//TODO: Upload here
}
}
我有一个 class returns 一个绑定到网格的列表。我的 属性 之一是一个 byte[] 数组,只有当有人双击带有文件的网格单元格中的单元格时,它才应该被填充。此时,应该下载该文件并呈现给用户。只是一个带有文件名和 Process.Start(...
因为我将列表绑定到网格,它正在调用“文件”属性 并填充值,使其具有 eager 类型的行为,而不是我正在寻找的 lazy 行为。
有什么方法可以阻止这个 属性 填写数据 class(下),而不必修改 UI 级别网格以明确不读取文件列?
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) {/*...*/}
//...
}
我阅读了一些关于 Lazy<T>
的内容,但是,我正在努力将其纳入我的常规工作流程,因为当我实施它时,我无法将要执行的值分配给 setter文件上传...
尝试,但我无法将字节[]分配回文件 属性,因为它是只读的...
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 { }
}
任何有关如何使用 Lazy<T>
或其他方法正确实现惰性 属性 的提示,我们将不胜感激。
如果我没理解错的话,你想实现 lazy 下载,但是 eager 上传
// Eager download (will be used in lazy download)
private byte[] DownLoad() {
// download here:
return FileHelper.DownloadAndDecompress(this.ID, "ErrorsDownloadFile");
}
// Lazy download ...
private Lazy<byte[]> m_File;
// ... which we assign in the constructor
public MyClass() {
...
m_File = new Lazy<byte[]>(Download);
...
}
// Our property
public byte[] File {
get {
// Lazy download
return m_File.Value;
}
set {
// we can't assign m_File.Value but we can recreate m_File
m_File = new Lazy<byte[]>(value);
//TODO: Upload here
}
}