具有变量参数的函数作为另一个函数的参数

时间:2014-02-27 13:32:29

标签: c#

如何定义一个函数,该函数需要另一个在c#中返回bool的函数?

为了澄清,这是我想用C ++做的事情:

void Execute(boost::function<int(void)> fctn)
{
    if(fctn() != 0)
    {
        show_error();
    }
}

int doSomething(int);
int doSomethingElse(int, string);

int main(int argc, char *argv[])
{
    Execute(boost::bind(&doSomething, 12));
    Execute(boost::bind(&doSomethingElse, 12, "Hello"));
}

在上面的示例中,Execute功能组合使用bind获得预期结果。

背景:

我有一堆函数,每个函数返回一个int但具有不同的参数计数,这些函数由相同的错误检查代码包围。我想避免的巨大代码重复...

3 个答案:

答案 0 :(得分:1)

您可以使用Func实现所需目标。例如

void Execute(Func<bool> myFunc)
{
   if(myFunc() == false)
   {
      // Show error
   }
}

然后,您可以将Func定义为方法或lambda:

// Define a method
private bool MethodFunc() {}

// Pass in the method
Execute(MethodFunc)

// Pass in the Lambda
Execute(() => { return true; });

您现在不需要传递参数,因为您现在可以从调用者的范围访问它们:

Execute(() => { return myBool; });
Execute(() => { return String.IsNullOrEmpty(myStr); });

答案 1 :(得分:1)

使用我的解决方案,你可以执行任何函数,任何输入参数,任何返回,这是一个非常通用的实现

示例:

public T YourMethod<T>(Func<T> functionParam)
{
   return functionParam.Invoke();
}

public bool YourFunction(string foo, string bar, int intTest)
{
    return true;
}

像此一样调用指定返回:

YourMethod<bool>(() => YourFunction("bar", "foo", 1));

或者像这样:

YourMethod(() => YourFunction("bar", "foo", 1));

答案 2 :(得分:0)

  without argument  do this 

  void Execute(Func<bool> fctn)
    {
        if(fctn() )
        {
            show_error();
        }
    }  

  with arguments you can do something like this:

    void Execute<T>(Func<T[],bool> fctn)
    {
        var v = new T[4];
        if(fctn(v) )
        {
            show_error();
        }
    }