将lambda函数作为参数传递并在方法主体中提供其参数

Oza*_*ver 0 c# delegates

我有一种方法可以处理插件的分页逻辑;

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 });
}
Run Code Online (Sandbox Code Playgroud)

在这里,我将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);
}
Run Code Online (Sandbox Code Playgroud)

我希望能够在Contains()方法主体中提供ManageDataTable()方法的参数,而不是随参数本身一起发送。为了更清楚,我想收到lambda函数x => x.Name.Contains()ManageDataTable(),和身体内部的ManageDataTable()我希望能够给一个参数来Contains()这是我的拉姆达功能的一部分方法。那可能吗?谢谢。

Jon*_*eet 6

在更改方法参数方面,我在这里可以想到两个选项。您可以使它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);
}
Run Code Online (Sandbox Code Playgroud)

您可以这样称呼:

DataTableHelper.ManageDataTable(glAccounts, Request,
    search => model => model.Name.Contains(search));
Run Code Online (Sandbox Code Playgroud)

这种方法实际上是一种高阶方法。或者,您可以采取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);
}
Run Code Online (Sandbox Code Playgroud)

您可以这样称呼:

DataTableHelper.ManageDataTable(glAccounts, Request,
    (model, search) => model.Name.Contains(search));
Run Code Online (Sandbox Code Playgroud)

使用哪一个无关紧要-但是值得您了解它们两个。