2014-03-29 58 views
0

如果只有中間線不同,我如何加入這兩種方法?如何加入兩種方法

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

如果我把它們加入到一個通用的方法如何distincs使用哪種方法中或GetWeeklyEleReport GetWeeklyGasReport?

+0

我知道如何創建通用的方法,但我想知道如何不同的內部使用的WCF方法取決於調用者。 – kosnkov

+0

任何人都應該能夠閱讀你的代碼並理解它在做什麼。你有一個方法'GetWeeklyGasReport()'這聽起來像它返回的東西,但你沒有分配一個返回值。 –

回答

1

您將使用委託。由於不必返回在你的中間函數值,你可以使用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); 
1
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)); 
} 
1

您可以使用模式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);