繁体   English   中英

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

[英]Can I pass a condition to a method as parameter in C#

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

是的你可以。 但是你仍然可以做些什么。 考虑一下

public void Foo(Action action, Func<Boolean> someCondition) {
    if (someCondition() == true) action();
}

你可以尝试这样的事情:

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

        if (increment)
            ++index;
        else
            --index;
    }

为什么不提取重复的代码到方法?

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);
}

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

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

在方法内部,您只需调用委托就好像它是一个方法(实际上,它是)。

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

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

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

Func可以保存到变量并按需要传递。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM