将 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));

你使用哪一个并不重要 - 但值得确保你理解它们。