如何连接两种方法

本文关键字:两种 方法 连接 何连接 | 更新日期: 2023-09-27 17:55:00

如果只有中间一行不同,我如何连接这两个方法?

public static WeekendElectricityReportResult CalculateWeekendElectricityReportResult(string dataFilPath)
        {
            string newFile = CopyFile(dataFilPath);
            GetOperationClient().GetWeeklyEleReport(newFile);
            RemoveNotUsedFiles(dataFilPath, newFile);
            return ReadCalculations<WeekendElectricityReportResult>(newFile);
        }
        public static WeekendGasReportResult CalculateWeekendGasReportResult(string dataFilPath)
        {
            string newFile = CopyFile(dataFilPath);
            GetOperationClient().GetWeeklyGasReport(newFile);
            RemoveNotUsedFiles(dataFilPath, newFile);
            return ReadCalculations<WeekendGasReportResult>(newFile);
        }

如果我将它们加入一个通用方法,如何区分使用GetWeeklyEleReport或GetWeeklyGasReport的中间方法?

如何连接两种方法

您将使用委托。由于您没有在中间函数中返回值,因此可以使用Action对象:

public static WeekendReportResult CalculateWeekendReportResult(string dataFilPath, Action<string> del)
    {
        string newFile = CopyFile(dataFilPath);
       del(newFile);
        RemoveNotUsedFiles(dataFilPath, newFile);
        return ReadCalculations<WeekendGasReportResult>(newFile);
    }

然后你可以这样调用这个方法:

Action<string> del = delegate(string file) {   
    GetOperationClient().GetWeeklyEleReport(file);
};
var eleReport = CalculateWeekendReportResult(file, del);
Action<string> del2 = delegate(string file) {   
    GetOperationClient().GetWeeklyGasReport(file);
};
var gasReport = CalculateWeekendReportResult(file, del2);
public static T CalculateReportResult<T>(string dataFilPath, Action<OperationClient, string> getAct, Func<string, T> readFunc)
{
    string newFile = CopyFile(dataFilPath);
    getAct(GetOperationClient(), newFile);
    RemoveNotUsedFiles(dataFilPath, newFile);
    return readFunc(newFile);
}

那么你可以做:

public static WeekendElectricityReportResult CalculateWeekendElectricityReportResult(string dataFilPath)
{
    return CalculateWeekendElectricityReportResult(dataFilPath, (client, path) => { client.GetWeeklyEleReport(path); }, file => ReadCalculations<WeekendElectricityReportResult>(file));
}

您可以使用模式Template Method。在C#中,可以在没有继承的情况下实现,只需将委托传递给模板方法即可。

public static T CalculateWeekendReportsResult<T>(string dataFilPath, Action<string> action)
{
    string newFile = CopyFile(dataFilPath);
    action(newFile);
    RemoveNotUsedFiles(dataFilPath, newFile);
    return ReadCalculations<T>(newFile);
}

用法是:

var report = CalculateWeekendReportsResult<WeekendElectricityReportResult>
                     (filePath, GetOperationClient().GetWeeklyEleReport);

var report = CalculateWeekendReportsResult<WeekendGasReportResult>
                     (filePath, GetOperationClient().GetWeeklyGasReport);