2011-05-05 46 views
0

祝大家好!以多種類似方法避免重複代碼(C#)

我在C#中有一些(可能會有幾十個)非常類似的方法。它們都內置於幾乎相同的圖案:

ResultObjectType MethodX(...input parameters of various types...) 
{ 
    nesting preparation code here... 
    { 
    { 
     resultObject = ExternalClass.GetResultForMethodX(input parameters of MethodX); 
    } 
    } 
    nesting result processing code here ... 
    return resultObject; 
} 

重複/相同的部分:ResultObjectType,準備代碼,結果處理代碼

不同部分:ExternalClass調用方法,輸入參數集(輸入參數數量,類型)。

重要:我不是在方法簽名的控制 - 無法進行更改。

我試圖避免重蹈類似代碼的所有塊像這樣的東西:

ResultObjectType MethodX(...input parameters of various types...) 
{ 
    return UniversalMethod( 
        new ExternalMethodDelegate(ExternalClass.GetResultForMethodX), 
        input parameters of MethodX...); 
} 

ResultObjectType UniversalMethod (Delegate d, input parameters of various types...) 
{ 
    nesting preparation code... 
    { 
     { 
      resultObject = 
       (d as ExternalMethodDelegate)(same input parameters as above); 
     } 
    } 
    nesting result processing code... 
    return resultObject; 
} 

到目前爲止,我只設法使它在這樣的情況下,所有參數都具有相同的已知類型的工作在編碼時。在嘗試用泛型代表來解決這個問題之後,我開始認爲這是無法實現的。即使我的代碼編譯時,它在運行時也不起作用。任何接受者?在此先感謝您的幫助!

+0

您的預處理和後處理代碼是否完全相同,以及他們是否在輸入參數周圍進行計算?所有方法的輸入參數在類型和順序上是否相同> – aqwert 2011-05-05 02:46:00

回答

2

下面是一個例子使用泛型委託:

int MethodY(int something, int other) 
{ 
    return UniversalMethod(() => GetResultForMethodY(something, other)); 
} 

string MethodX(string something) 
{ 
    return UniversalMethod(() => GetResultForMethodX(something)); 
} 

T UniversalMethod<T>(Func<T> fetcher) 
{ 
    T resultObject; 
    //nesting preparation code here... 
    { 
     resultObject = fetcher(); 
    } 
    //nesting result processing code here ... 
    return resultObject; 
} 

如果ResultObjectType始終是相同的,那麼你可以刪除所有T秒。

+0

這正是我所需要的。非常感謝Porges! – Puzzled 2011-05-05 23:52:02

0

重複/相同的部分:ResultObjectType,準備代碼,結果處理代碼。

您應該專注於使這些零件儘可能地隔離。

另一種方法是代碼生成。