我有一个方法列表,这些方法基本上做的是相同的事情,只是有一些不同:
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/zh-cn/library/bb534960
使用 Action<T>
: http://msdn.microsoft.com/zh-cn/library/018hxwa8
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);