如何将方法名称作为参数传递?

Mar*_*son 4 c# asp.net c#-4.0

我刚刚注意到我在ASP.NET应用程序中重复了很多C#代码,所以想要创建一个通用方法.我有一系列这样的私有方法:

private void PopulateMyRepeatedControl()
{
    DBUtil DB = new DBUtil();
    DataTable symbols = GetSelectedSymbols();
    DataTable tradeGrades = GetSelectedTradeGrades();
    DataTable executionGrades = GetSelectedExecutionGrades();        

    chtMyRepeatedChart.DataSource = DB.MyRepeatedCall (
        int.Parse(txtStartBalance.Text),
        int.Parse(ddlTradeTypes.SelectedValue),
        ddlRepeatedTrades.SelectedValue,
        radSide.SelectedValue,
        ddlTradeSetups.SelectedValue,
        symbols,
        ddlChartTimeFrames.SelectedValue,
        int.Parse(ddlHours.SelectedValue),
        int.Parse(ddlYears.SelectedValue),
        int.Parse(ddlMonths.SelectedValue),
        int.Parse(ddlDays.SelectedValue),
        int.Parse(ddlNumSCs.SelectedValue),
        txtDateFrom.Text,
        txtDateTo.Text,
        tradeGrades,
        executionGrades,
        int.Parse(txtMinProfitPips.Text),
        int.Parse(txtMaxProfitPips.Text));

    chtMyRepeatedChart.DataBind();
}
Run Code Online (Sandbox Code Playgroud)

所以,我想替换DB.MyRepeatedCall,chtMyRepeatedChart并将它们作为参数传递给泛型函数.那可能吗?我的表单上有很多图表,它们使用相同数量的参数.

谢谢

更新 根据Frederik的解决方案,我做到了这一点:

private delegate IEnumerable<DataTable> GetDataSource(
    int TradeType,
    string RepeatedTrades,
    string Side,
    string TradeSetup,
    DataTable symbols,
    string ChartTimeFrame,
    int Hour,
    int Year,
    int Month,
    int Day,
    int NumSCs,
    string DateFrom,
    string DateTo,
    DataTable TradeGrades,
    DataTable ExecutionGrades,
    int MinProfitPips,
    int MaxProfitPips);

private void PopulateControl(Chart chart, GetDataSource getDataSource)
{
    //DBUtil DB = new DBUtil();
    DataTable symbols = GetSelectedItems("symbol", listSymbols);
    DataTable tradeGrades = GetSelectedItems("tradeGrade", listTradeGrades);
    DataTable executionGrades = GetSelectedItems("executionGrade", listExecutionGrades);

    chart.DataSource = getDataSource(
        int.Parse(ddlTradeTypes.SelectedValue),
        ddlRepeatedTrades.SelectedValue,
        radSide.SelectedValue,
        ddlTradeSetups.SelectedValue,
        symbols,
        ddlChartTimeFrames.SelectedValue,
        int.Parse(ddlHours.SelectedValue),
        int.Parse(ddlYears.SelectedValue),
        int.Parse(ddlMonths.SelectedValue),
        int.Parse(ddlDays.SelectedValue),
        int.Parse(ddlNumSCs.SelectedValue),
        txtDateFrom.Text,
        txtDateTo.Text,
        tradeGrades,
        executionGrades,
        int.Parse(txtMinProfitPips.Text),
        int.Parse(txtMaxProfitPips.Text));

    chart.DataBind();        
}       
Run Code Online (Sandbox Code Playgroud)

我用这个命令调用该函数:

PopulateControl (chtEquityCurve, DB.GetAccountBalances());
Run Code Online (Sandbox Code Playgroud)

我在intellisense中得到这个错误: No overload for method 'GetAccountBalances' takes 0 arguments.

Fre*_*örk 6

首先,建立一个委托类型(通常我建议人们使用一个可用的Func委托,但他们只支持最多16个输入参数,你有18个).给它一个合适的名称并定义所有输入参数,使它们具有正确的类型和描述性名称.让委托返回IEnumerable<T>:

public delegate IEnumerable<WhateverTypeIsReturned> GetDataSource(int firstParam, [...]);
Run Code Online (Sandbox Code Playgroud)

然后,修改PopulateMyRepeatedControl,使其看起来像这样:

private void PopulateMyRepeatedControl(Chart chart, GetDataSource getDataSource)
{
    DBUtil DB = new DBUtil();
    DataTable symbols = GetSelectedSymbols();
    DataTable tradeGrades = GetSelectedTradeGrades();
    DataTable executionGrades = GetSelectedExecutionGrades();        

    chart.DataSource = getDataSource (
        int.Parse(txtStartBalance.Text),
        int.Parse(ddlTradeTypes.SelectedValue),
        ddlRepeatedTrades.SelectedValue,
        radSide.SelectedValue,
        ddlTradeSetups.SelectedValue,
        symbols,
        ddlChartTimeFrames.SelectedValue,
        int.Parse(ddlHours.SelectedValue),
        int.Parse(ddlYears.SelectedValue),
        int.Parse(ddlMonths.SelectedValue),
        int.Parse(ddlDays.SelectedValue),
        int.Parse(ddlNumSCs.SelectedValue),
        txtDateFrom.Text,
        txtDateTo.Text,
        tradeGrades,
        executionGrades,
        int.Parse(txtMinProfitPips.Text),
        int.Parse(txtMaxProfitPips.Text));

    chart.DataBind();
}
Run Code Online (Sandbox Code Playgroud)

调用方法时,只需传递图表和用于收集数据的方法:

PopulateMyRepeatedControl(oneChart, OneDataCollectionMethod);
PopulateMyRepeatedControl(anotherChart, AnotherDataCollectionMethod);
Run Code Online (Sandbox Code Playgroud)

当然,TheDataCollectionMethod必须有正确的签名,否则代码将无法编译.

更新有关
您的更新; 请注意您要将该方法作为参数传递,而不是调用它:

PopulateControl (chtEquityCurve, DB.GetAccountBalances);
Run Code Online (Sandbox Code Playgroud)

请注意,方法名称后面没有paranthesis.