2014-03-29 3 views
0

how coudl 중간 선만 다르면이 두 방법에 합류합니까? 내가 GetWeeklyEleReport 또는 GetWeeklyGasReport을 사용하는 가운데 어떤 방법을 distincs하는 방법을 하나의 일반적인 방법에 가입하면두 가지 방법을 결합하는 방법

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

?

+0

내가 일반적인 방법을 만드는 방법을 알고 있지만 내가 어떻게 구별 발신자에 의존하는 WCF 방법을 사용하는 내부 궁금 해서요. – kosnkov

+0

누구든지 코드를 읽고 그것이하는 일을 이해할 수 있어야합니다. 'GetWeeklyGasReport()'메소드가 있는데, 뭔가를 리턴하지만 반환 값을 지정하지 않은 것처럼 들립니다. –

답변

1

대리인을 사용합니다.

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 WeekendReportResult CalculateWeekendReportResult(string dataFilPath, Action<string> del) 
    { 
     string newFile = CopyFile(dataFilPath); 

     del(newFile); 

     RemoveNotUsedFiles(dataFilPath, newFile); 

     return ReadCalculations<WeekendGasReportResult>(newFile); 
    } 

그런 다음이 같은이 방법을 부를 것이다 : 당신이 당신의 중간 기능의 값을 반환하지 않기 때문에, 당신은 Action 개체를 사용할 수 있습니다 :

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); 
관련 문제