在C#中将语句切换为调用方法的替代方法

Sum*_*ngh 1 c# lambda delegates switch-statement

我有一个方法,它使用switch语句根据输入参数调用其他方法,如下所示:

    switch (reportName)
            {
                case A:
                    return GenerateReportA(reportName, model, language);
                case B:
                    return GenerateReportB(reportName, model, language);
                case C:
                    return GenerateReportC(reportName, model, language);
                case D:
                    return GenerateReportD(reportName, model, language);
                case E:
                    return GenerateReportE(reportName, model, language);

                and so on...                    
            }
Run Code Online (Sandbox Code Playgroud)

我知道随着越来越多的报告添加到系统中,该switch语句将继续增加。是否有其他方法可以实现这一目标?...代表?... Lambda?我所知道的是,我所有的GenerateReport方法都将具有相同的签名。

div*_*div 5

正如SLaks所说,您可以将交换机重构为字典。我假设您的三个输入参数是字符串。根据需要进行调整:

// the dictionary value is a function delegate with three string input
// parameters and a string result
var _generateReport = new Dictionary<string, Func<string, string, string, string>>()
    { 
        {"A", GenerateReportA}, 
        {"B", GenerateReportB}, 
        {"C", GenerateReportC}, 
        {"D", GenerateReportD}, 
        {"E", GenerateReportE} 
        ...
    };
Run Code Online (Sandbox Code Playgroud)

然后,您可以将switch语句重写为

if (_generateReport.ContainsKey(reportName)) 
     _generateReport[reportName].Invoke(reportName, model, language); 
Run Code Online (Sandbox Code Playgroud)