c# - C# 传递带有参数的 Func,其中 1 个参数在传递时设置,其他参数在内部设置
问题描述
您好已经创建了这种从 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 时要设置 dict
像这样:
private async Task OnFilesDropped(FileUploadModel upload)
{
var dict = new Dictionary<int, TreeItemModel>();
OfficeHelper.ExcelExtension.ExcelReader(upload, () => ExcelToProjTree(dict));
}
可能吗?如果是,如何?
解决方案
由于您将提供一个静态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));
And finally update the invocation of the function so that you only pass the first two parameter arguments:
func(stringTable, r); // `dict` will automatically be bound inside of `func`
Given that func
still returns an Action
, you might want to invoke that right away:
func(stringTable, r)();
推荐阅读
- python - ipv6 套接字!pc树莓派通信错误:socket.gaierror:[Errno -2]名称或服务未知
- ros - 为什么我在构建工作区时会出现 makefile 141 错误
- python - 将numpy数组打印为python硬代码的简单方法
- python - 使用 python 的 Azure Function App:如何访问用户组以进行授权
- spring - GWT Keycloak 注销重定向
- javascript - WebGL:INVALID_OPERATION:useProgram:程序无效
- android - Play 商店的发布前报告详细信息:Android 兼容性警告 - API(不支持)
- javascript - 如何使用 for...of 循环跟踪数组索引?
- c# - 尽管是 Grid 的子级,但标签未出现在 Grid 中
- javascript - Angular Link 将在 sanitizer 之后引用页面,而不是刷新 IFRAME