避免在多个类似方法中重复代码 (C#)

Avoiding repetitive code in multiple similar methods (C#)(避免在多个类似方法中重复代码 (C#))
本文介绍了避免在多个类似方法中重复代码 (C#)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好!

我在 C# 中有一组(可能还有几十个)非常相似的方法.它们都建立在几乎相同的模式上:

I have a set of a few (and potentially will have dozens more) of very similar methods in C#. They all built on almost identical pattern:

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,准备代码,结果处理代码.

不同部分:要调用的外部类方法,输入参数集(输入参数的数量,它们的类型).

重要提示:我无法控制方法签名 - 无法更改它们.

我试图避免使用类似这样的代码重复所有类似代码块:

I am trying to avoid repeating all blocks of similar code with something like this:

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

到目前为止,我只设法使其以这种方式工作,以防所有参数在编码时具有相同的已知类型.经过多次尝试用通用代表解决这个问题后,我开始认为这是不可能实现的.即使我的代码编译,它在运行时也不起作用.有接盘侠吗?提前感谢您的帮助!

So far I only managed to make it work in this manner in case where all parameters have the same known type at the time of coding. After a number of attempts to tackle this problem with generic delegates I am starting to think this is not possible to achieve. Even when my code compiles, it does not work at runtime. Any takers? Thanks in advance for your help!

推荐答案

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

Here's an example using generic delegates:

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.

If ResultObjectType is always the same then you can remove all Ts.

这篇关于避免在多个类似方法中重复代码 (C#)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)