我有2个按钮执行相同的功能,但条件不同。 代码是这样的。
private void button1_Click(){
// do function1
if(condition){
...decrement an integer
//do function2
}
}
private void button2_Click(){
// do function1
if(another condition){
...increment an integer
//do function2
}
}
我可以传递condition1和condition2并递增,递减到方法吗?
答案 0 :(得分:3)
是的,你可以。但是你仍然可以做些什么。考虑一下这个
public void Foo(Action action, Func<Boolean> someCondition) {
if (someCondition() == true) action();
}
答案 1 :(得分:1)
您可以尝试这样的事情:
private void buttonClick()
{
DoSomething(condition ? true : false);
}
private void DoSomething(bool increment)
{
// do stuff
if (increment)
++index;
else
--index;
}
答案 2 :(得分:1)
为什么不将重复的代码提取到方法?
private void Function1()
{
// do function1
}
private void Function2()
{
// do function2
}
private void button1_Click()
{
Function1() ;
if(condition)
{
//...decrement an integer
Function2();
}
}
private void button2_Click()
{
Function1();
if(another condition)
{
//...increment an integer
Function2();
}
}
如果您有许多具有相同结构的类似方法,请考虑创建
private void DoSomething(Func<bool> condition, Action action)
{
Function1();
if (condition())
{
action();
Function2();
}
}
以这种方式调用它:
private int value;
private void button2_Click()
{
DoSomething(() => value < 5, () => value++);
}
当然,如果您需要将某些参数传递给条件或操作,则应更改Func
或Action
类型。如果您需要从操作中返回一些值,也可以使用Func
代替Action
。
private int value;
private void button2_Click()
{
DoSomething((x) => x % 2 == 0, (x) => x.ToString());
}
private void DoSomething(Func<int, bool> condition, Func<int, string> action)
{
Function1();
if (condition(value))
{
string result = action(value);
Function2();
}
}
如果您的情况和行动不那么简单,请使用命名方法而不是lambdas:
private bool FooCondition(int x)
{
// complex condition here
}
private string BarAction(int x)
{
// complex action here
}
private void button2_Click()
{
DoSomething(FooCondition, BarAction);
}
答案 3 :(得分:0)
您可以通过在方法中包装条件1和条件2并将它们用作委托来实现此目的,这允许将它们传递给方法。
例如,您可以使用委托签名的消息,期望一个方法接受x个输入并返回一个布尔值。然后为条件1和2创建匹配该签名的方法,并将适当的方法传递给方法。
在方法中,您只需将委托称为方法(实际上就是这样)。
查看微软有关代表的文档:http://msdn.microsoft.com/en-us/library/ms173171(v=vs.80).aspx
答案 4 :(得分:0)
如果您使用的是.NET 3.0,则可以将Func传递给该方法。存在参数且没有参数的两个类。
返回布尔值和参数的Func
可以用这样的lambda编写:
condition => {
if (condition)
index++;
else
index--;
}
Func
可以保存到变量中并按需要传递。