将代码作为参数传递给方法

本文关键字:方法 参数传递 代码 | 更新日期: 2023-09-27 18:36:23

我有一个方法列表,它们做几乎相同的事情,除了一些区别:

void DoWork(string parameter1, string parameter2)
{
//Common code
...
//Custom code
...
//Common code
...
}

我想通过从另一个方法传递自定义代码来重用通用代码来简化解决方案。

假设我必须使用带有参数的操作来完成此操作,但无法弄清楚如何完成此操作。

将代码作为参数传递给方法

您可以尝试模板方法模式

基本上是这样说的

abstract class Parent
{
   public virtual void DoWork(...common arguments...)
   {
      // ...common flow
      this.CustomWork();
      // ...more common flow
   }
   // the Customwork method must be overridden
   protected abstract void CustomWork();
}

在子班级中

class Child : Parent
{
   protected override void CustomWork()
   {
      // do you specialized work
   }
}

其他答案很好,但您可能需要从自定义代码中返回一些内容,因此您需要改用 Func。

void Something(int p1, int p2, Func<string, int> fn)
{
   var num = p1 + p2 + fn("whatever");
   // . . .
}

这样称呼它:

Something(1,2, x => { ...; return 1; });

或:

int MyFunc(string x)
{
    return 1;
}
Something(1,2 MyFunc);

您可以使用委托来处理此问题。 它可能看起来像这样:

void DoWork(string parameter1, string parameter2, Action<string,string> customCode)
{
    // ... Common code
    customCode(parameter1, parameter2);
    // ... Common code
    customCode(parameter1, parameter2);
    // ... Common code
}

如果自定义代码不必与通用代码交互,则很容易:

void DoWork(..., Action custom)
{
    ... Common Code ...
    custom();
    ... Common Code ...
}

假设您需要在自定义代码中使用两个字符串参数,以下内容应该可以完成工作。 如果您实际上并不关心自定义代码的结果,则可以将Func<string, string, TResult>替换为Action<string, string>。 此外,如果自定义代码需要处理来自其上方公共代码的结果,则可以调整 Func<>(或 Action<>)采用的参数类型,然后传入相应的值。

void DoWork(string parameter1, string parameter2, Func<string, string, TResult> customCode) {
    //Common code 
    var customResult = customCode(parameter1, parameter2);
    //Common code 
}

使用Func<T, TResult>:http://msdn.microsoft.com/en-us/library/bb534960

使用Action<T>:http://msdn.microsoft.com/en-us/library/018hxwa8