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

时间:2012-06-05 19:45:11

标签: c# .net parameters delegates action

除了一些差异之外,我有一个几乎完全相同的方法列表:

void DoWork(string parameter1, string parameter2)

{

//Common code
...

//Custom code
...

//Common code
...

}

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

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

5 个答案:

答案 0 :(得分:2)

您可以尝试Template method pattern

其中基本上是这样的

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

答案 1 :(得分:1)

您可以使用delegates来处理此问题。它可能看起来像:

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

答案 2 :(得分:1)

如果自定义代码不必与公共代码交互,那么很容易:

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

其他答案很棒,但您可能需要从自定义代码中返回一些内容,因此您需要使用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);