将 lambda 函数作为参数传递并在方法体中给出其参数
Passing lambda function as parameter and give its parameter in the method body
我有一个方法可以处理插件的一些分页逻辑;
public async Task<JsonResult> DataPagination()
{
List<GLAccountModel> glAccounts = await HttpClientHelper.GetListHttpResponseAsync<GLAccountModel>(httpBaseAdress, "GLAccount", "GetAll");
var (filteredResultCount, totalRecord) = DataTableHelper.ManageDataTable(glAccounts, Request, x => x.Name.Contains());
return Json(new { data = glAccounts, draw = Request["draw"], recordsTotal = totalRecord, recordsFiltered = filteredResultCount });
}
在这里,我将 lambda 函数 x => x.Name.Contains()
传递给 ManageDataTable
方法。这是ManageDataTable
方法的实现;
public static (int, int) ManageDataTable<TModel>(List<TModel> models, HttpRequestBase request, Func<TModel, bool> lambdaExpression) where TModel : class
{
string search = request["search[value]"];//arama
if (!string.IsNullOrEmpty(search))
{
models = models.Where(lambdaExpression).ToList();
}
return (filteredResultCount, totalRecord);
}
我希望能够在 ManageDataTable()
方法的主体中提供 Contains()
方法的参数,而不是将其与参数本身一起发送。更清楚地说,我想从 ManageDataTable()
接收 lambda 函数 x => x.Name.Contains()
,并且在 ManageDataTable()
的主体内我希望能够为 Contains()
提供参数方法,它是我的 lambda 函数的一部分。那可能吗?谢谢。
在更改方法参数方面,我可以想象这里有两种选择。您可以像这样将其设为 Func<string, Func<TModel, bool>>
:
public static (int, int) ManageDataTable<TModel>(
List<TModel> models,
HttpRequestBase request,
Func<string, Func<TModel, bool>> filterProvider)
where TModel : class
{
string search = request["search[value]"];//arama
if (!string.IsNullOrEmpty(search))
{
var filter = filterProvider(search);
models = models.Where(filter).ToList();
}
return (filteredResultCount, totalRecord);
}
你可以这样称呼它:
DataTableHelper.ManageDataTable(glAccounts, Request,
search => model => model.Name.Contains(search));
这种方法实际上是一种高阶方法。或者,您可以像这样使用 Func<TModel, string, bool>
:
public static (int, int) ManageDataTable<TModel>(
List<TModel> models,
HttpRequestBase request,
Func<TModel, string, bool> filter)
where TModel : class
{
string search = request["search[value]"];//arama
if (!string.IsNullOrEmpty(search))
{
models = models.Where(model => filter(model, search)).ToList();
}
return (filteredResultCount, totalRecord);
}
你可以这样称呼它:
DataTableHelper.ManageDataTable(glAccounts, Request,
(model, search) => model.Name.Contains(search));
你使用哪一个并不重要 - 但值得确保你理解它们。
我有一个方法可以处理插件的一些分页逻辑;
public async Task<JsonResult> DataPagination()
{
List<GLAccountModel> glAccounts = await HttpClientHelper.GetListHttpResponseAsync<GLAccountModel>(httpBaseAdress, "GLAccount", "GetAll");
var (filteredResultCount, totalRecord) = DataTableHelper.ManageDataTable(glAccounts, Request, x => x.Name.Contains());
return Json(new { data = glAccounts, draw = Request["draw"], recordsTotal = totalRecord, recordsFiltered = filteredResultCount });
}
在这里,我将 lambda 函数 x => x.Name.Contains()
传递给 ManageDataTable
方法。这是ManageDataTable
方法的实现;
public static (int, int) ManageDataTable<TModel>(List<TModel> models, HttpRequestBase request, Func<TModel, bool> lambdaExpression) where TModel : class
{
string search = request["search[value]"];//arama
if (!string.IsNullOrEmpty(search))
{
models = models.Where(lambdaExpression).ToList();
}
return (filteredResultCount, totalRecord);
}
我希望能够在 ManageDataTable()
方法的主体中提供 Contains()
方法的参数,而不是将其与参数本身一起发送。更清楚地说,我想从 ManageDataTable()
接收 lambda 函数 x => x.Name.Contains()
,并且在 ManageDataTable()
的主体内我希望能够为 Contains()
提供参数方法,它是我的 lambda 函数的一部分。那可能吗?谢谢。
在更改方法参数方面,我可以想象这里有两种选择。您可以像这样将其设为 Func<string, Func<TModel, bool>>
:
public static (int, int) ManageDataTable<TModel>(
List<TModel> models,
HttpRequestBase request,
Func<string, Func<TModel, bool>> filterProvider)
where TModel : class
{
string search = request["search[value]"];//arama
if (!string.IsNullOrEmpty(search))
{
var filter = filterProvider(search);
models = models.Where(filter).ToList();
}
return (filteredResultCount, totalRecord);
}
你可以这样称呼它:
DataTableHelper.ManageDataTable(glAccounts, Request,
search => model => model.Name.Contains(search));
这种方法实际上是一种高阶方法。或者,您可以像这样使用 Func<TModel, string, bool>
:
public static (int, int) ManageDataTable<TModel>(
List<TModel> models,
HttpRequestBase request,
Func<TModel, string, bool> filter)
where TModel : class
{
string search = request["search[value]"];//arama
if (!string.IsNullOrEmpty(search))
{
models = models.Where(model => filter(model, search)).ToList();
}
return (filteredResultCount, totalRecord);
}
你可以这样称呼它:
DataTableHelper.ManageDataTable(glAccounts, Request,
(model, search) => model.Name.Contains(search));
你使用哪一个并不重要 - 但值得确保你理解它们。