设计模式——避免在多个相似的方法中重复代码(c#)

本文关键字:代码 方法 相似 设计模式 | 更新日期: 2023-09-27 17:55:02

大家好!

我在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;
}
到目前为止,我只设法使它在编码时所有参数具有相同已知类型的情况下以这种方式工作。在多次尝试用通用委托解决这个问题之后,我开始认为这是不可能实现的。即使我的代码编译了,它也不能在运行时工作。什么人吗?提前感谢您的帮助!

设计模式——避免在多个相似的方法中重复代码(c#)

下面是一个使用泛型委托的例子:

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

重复/相同部分:ResultObjectType,准备代码,结果处理代码。

你应该集中精力使这部分尽可能孤立。