使用委托来简化函数调用

时间:2010-07-07 15:30:42

标签: c#

我有一个布尔函数,用于许多其他函数的决策。并且每次都向用户提供消息框或允许其继续,具体取决于该函数的返回值。所以我的伪代码可能如下所示:

private bool IsConsented()
{
    //some business logic
}

private void NotReal()
{
    if (IsConsented())
    {
        //call function A
    }
    else
    {
        MessageBox.Show("Need consent first.");
    }
}

private void NotReal2()
{
    if (IsConsented())
    {
        //call function B
    }
    else
    {
        MessageBox.Show("Need consent first.");
    }
}

我正在寻找一种更简单的方法,而不是将if-else逻辑硬编码到我的每个函数中。我希望能够有这样的功能:

private void CheckConsent(function FunctionPointer)
        {
            if (IsConsented())
            {
                //call the function
                FunctionPointer();
            }
            else
            {
                MessageBox.Show("Need consent first.");
            }
        }

这样我就可以传递指向函数的指针。我真的怀疑这与委托有关,但我不知道语法,我不明白如何使用委托来传递参数。

2 个答案:

答案 0 :(得分:5)

您需要声明委托(或使用内置的代理,例如Action):

 private void CheckConsent(Action action)
 {
        if (IsConsented())
        {
             action();
        }
        else
        {
            MessageBox.Show("Need consent first.");
        }
 }

然后你可以这样做:

 private void NotReal()
 {
      this.CheckConsent( () =>
      {
          // Do "NotReal" work here...
      });
 }

答案 1 :(得分:0)

Reed Copsey的做法是干净的。它使用已经定义的Action委托和lambda表达式。但如果你对此感到不舒服,那就是旧的做法。

private delegate void realDelegate();
realDelegate d = new realDelegate(NotReal);

您现在可以致电

private void CheckConsent(realDelegate d)
{
   if(d !=null)
    d();
}