5

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

我可以将条件 1 和条件 2 以及递增、递减传递给方法吗?

4

5 回答 5

5

是的你可以。但是你能做的仍然有限。考虑这个

public void Foo(Action action, Func<Boolean> someCondition) {
    if (someCondition() == true) action();
}
于 2012-04-18T06:26:53.253 回答
1

你可以尝试这样的事情:

    private void buttonClick()
    {
        DoSomething(condition ? true : false);
    }
    private void DoSomething(bool increment)
    {
        // do stuff

        if (increment)
            ++index;
        else
            --index;
    }
于 2012-04-18T06:23:22.047 回答
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++);
}

当然,如果您需要将一些参数传递给条件或操作,您应该更改FuncAction键入。如果您需要从操作中返回一些值,也可以使用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();
    }
}

如果您的条件和操作不是那么简单,请使用命名方法而不是 lambda:

private bool FooCondition(int x)
{
   // complex condition here
}

private string BarAction(int x)
{
    // complex action here
}

private void button2_Click()
{
    DoSomething(FooCondition, BarAction);
}
于 2012-04-18T06:26:12.070 回答
0

您可以通过将条件 1 和条件 2 包装在方法中并将它们用作委托来实现此目的,这允许将它们传递到方法中。

例如,您可以让带有委托签名的消息期望采用 x 个输入并返回布尔值的方法。然后为条件 1 和 2 创建与该签名匹配的方法,并将适当的方法传递给该方法。

在方法内部,您只需将委托称为方法(实际上就是方法)。

查看 Microsoft 围绕代表的文档:http: //msdn.microsoft.com/en-us/library/ms173171 (v=vs.80).aspx

于 2012-04-18T06:17:03.773 回答
0

如果您使用的是 .NET 3.0,则可以将Func传递给该方法。带参数和不带参数的两个类都存在。返回一个Func布尔值和一个参数,可以用这样的 lambda 来编写:

condition => {
  if (condition)
    index++;
  else
    index--;
}

Func可以保存到变量中并根据需要传递。

于 2012-04-18T06:26:34.603 回答