您好,已經創建了這個方法來從 excel 中讀取資料:
public static Dictionary<int, TreeItemModel> ExcelReader(FileUploadModel upload,
Func<Dictionary<int, string>, Row, object, Action> func)
{
try
{
var dict = new Dictionary<int, TreeItemModel>();
using (var doc = SpreadsheetDocument.Open(upload.Stream, false))
{
var workbookPart = doc.WorkbookPart;
var worksheetPart = workbookPart.WorksheetParts.First();
var sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
var stringTable = LoadSharedStringDictionarySax(workbookPart.SharedStringTablePart);
foreach (var r in sheetData.Elements<Row>())
{
func(stringTable, r, dict);
}
}
upload.Stream.Close();
upload.UploadCompletion = 100;
return dict;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
throw;
}
}
我在其他類中呼叫這個方法是這樣的:
private async Task OnFilesDropped(FileUploadModel upload)
{
var dict = new Dictionary<int, TreeItemModel>();
OfficeHelper.ExcelExtension.ExcelReader(upload, ExcelToProjTree);
}
private static Action ExcelToProjTree(Dictionary<int, string> stringTable, Row r, Dictionary<int, TreeItemModel> dict)
{
//Some stuff
}
stringTable 和 r 在呼叫方法時設定,但我想在呼叫 ExcelReader 時設定字典
就像這樣:
private async Task OnFilesDropped(FileUploadModel upload)
{
var dict = new Dictionary<int, TreeItemModel>();
OfficeHelper.ExcelExtension.ExcelReader(upload, () => ExcelToProjTree(dict));
}
是否可以?如果是,如何?
uj5u.com熱心網友回復:
由于您將提供一個靜態object引數引數(這稱為部分應用順便說一句),您需要從結果Func型別的引數串列中洗掉它:
public static Dictionary<int, TreeItemModel> ExcelReader(FileUploadModel upload,
Func<Dictionary<int, string>, Row, Action> func) { /* */ }
然后確保您作為引數提供的 lambda 也ExcelReader具有正確的簽名(它仍然應該接受Dictionary<int, string>和Row引數):
OfficeHelper.ExcelExtension.ExcelReader(upload, (stringTable, row) => ExcelToProjTree(stringTable, row, dict));
最后更新函式的呼叫,以便只傳遞前兩個引數:
func(stringTable, r); // `dict` will automatically be bound inside of `func`
鑒于func仍然回傳Action,您可能想立即呼叫它:
func(stringTable, r)();
uj5u.com熱心網友回復:
您可以使用 Lazy<T>
private Lazy<Dictionary<int, TreeItemModel>> dict;
// Constructor
public YourClass()
{
this.dict = Lazy<Dictionary<int, TreeItemModel>>(
() => ExcelToProjTree(new Dictionary<int, TreeItemModel>()));
}
private async Task OnFilesDropped(FileUploadModel upload)
{
var dict = new Dictionary<int, TreeItemModel>();
// ExcelToProjTree Will be eveluated only now
OfficeHelper.ExcelExtension.ExcelReader(upload, () => dict.Value);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/338411.html
