我可以将条件作为参数传递给C#中的参数

时间:2012-04-18 06:14:50

标签: c# c#-4.0

我有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并递增,递减到方法吗?

5 个答案:

答案 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++);
}

当然,如果您需要将某些参数传递给条件或操作,则应更改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();
    }
}

如果您的情况和行动不那么简单,请使用命名方法而不是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可以保存到变量中并按需要传递。