我有一个方法列表,它们几乎做同样的事情,除了一些区别:
void DoWork(string parameter1, string parameter2)
{
//Common code
...
//Custom code
...
//Common code
...
}
我想通过从另一种方法传递自定义代码来重用公共代码来简化解决方案。
我假设我必须使用带参数的操作来完成此操作,但不知道如何操作。
我有一个方法列表,它们几乎做同样的事情,除了一些区别:
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
}
}
您将使用委托来处理此问题。它可能看起来像:
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
The other answers are great, but you may need to return something from the custom code, so you would need to use Func instead.
void Something(int p1, int p2, Func<string, int> fn)
{
var num = p1 + p2 + fn("whatever");
// . . .
}
Call it like this:
Something(1,2, x => { ...; return 1; });
Or:
int MyFunc(string x)
{
return 1;
}
Something(1,2 MyFunc);