通行码的方法作为一个参数(Pass code to a method as an argument)

2019-09-17 18:56发布

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

void DoWork(string parameter1, string parameter2)

{

//Common code
...

//Custom code
...

//Common code
...

}

我想通过传递自定义代码从另一种方法重复使用通用代码精简解决方案。

我想我必须使用带有参数的行动来做到这一点,但无法弄清楚如何。

Answer 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);


Answer 2:

你可以尝试的模板方法模式

基本上规定soemthing这样

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


Answer 3:

你可以使用委托来处理这个问题。 它可能会是这个样子:

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


Answer 4:

如果自定义代码没有与公共代码进行交互,这很容易:

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


Answer 5:

假设你需要在自定义代码使用两个字符串参数,下面应该把工作做好。 如果你不真正关心的自定义代码的结果,你可以更换Func<string, string, TResult>Action<string, string> 。 此外,如果自定义代码需要处理从它上面的公共代码的结果,可以调整所述参数类型的函数功能<>(或动作<>)中取和然后通过在适当的值。

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



文章来源: Pass code to a method as an argument