C# 使用委托简化函数调用

C# 使用委托简化函数调用,c#,C#,我有一个布尔函数,它用于许多其他函数的决策。每一次,用户要么得到一个消息框,要么被允许继续,这取决于该函数的返回值。因此,我的伪代码可能如下所示: private bool IsConsented() { //some business logic } private void NotReal() { if (IsConsented()) { //call function A } else { MessageBo

我有一个布尔函数,它用于许多其他函数的决策。每一次,用户要么得到一个消息框,要么被允许继续,这取决于该函数的返回值。因此,我的伪代码可能如下所示:

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

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

您需要声明委托或使用内置委托,例如操作:

 private void CheckConsent(Action action)
 {
        if (IsConsented())
        {
             action();
        }
        else
        {
            MessageBox.Show("Need consent first.");
        }
 }
然后你可以做:

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

您需要声明委托或使用内置委托,例如操作:

 private void CheckConsent(Action action)
 {
        if (IsConsented())
        {
             action();
        }
        else
        {
            MessageBox.Show("Need consent first.");
        }
 }
然后你可以做:

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

里德·科普西的做法是干净的。它使用已定义的动作委托和lambda表达式。但如果你对此感到不舒服,这里是老办法

private delegate void realDelegate();
realDelegate d = new realDelegate(NotReal);
你现在可以打电话了

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

里德·科普西的做法是干净的。它使用已定义的动作委托和lambda表达式。但如果你对此感到不舒服,这里是老办法

private delegate void realDelegate();
realDelegate d = new realDelegate(NotReal);
你现在可以打电话了

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

我认为你的计划是正确的。查看Microsoft提供的这篇介绍学员基本知识的文档。迈克是对的。您可能首先需要了解代理的基本知识。学习基础知识。你自己试试这个问题。与他人发布的解决方案进行比较。然后你应该试试里德·科佩(Reed Copsey)用动作委托和lambda表达式给出的答案。我认为你的答案是正确的。查看Microsoft提供的这篇介绍学员基本知识的文档。迈克是对的。您可能首先需要了解代理的基本知识。学习基础知识。你自己试试这个问题。与他人发布的解决方案进行比较。然后,您应该尝试Reed Copsey发布的答案,使用动作委托和lambda表达式。