2011-05-05 93 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,准备代码,结果处理代码。

您应该专注于使这些零件尽可能地隔离。

另一种方法是代码生成。