c# -传递函数(带参数)作为函数的参数

本文关键字:参数 函数 传递函数 | 更新日期: 2023-09-27 18:16:35

我需要创建一个函数,它将采用另一个函数(总是不同数量的函数)。有人能帮帮我吗?

Function DoThisFunction将有不同类型和数量的参数。可以有不同数量的条件函数

我试着在这里展示:

bool MyFunction(condition1(args), condition2(args), condition3(args), ... , DoThisFunction(args))
{
    ...
    if (condition1(int x) == true && condition2(int x, string C) == 5)
    {
        DoThisFunction(par1, par2, par3 ...);
        return true;
    }
}
bool condition1(int x)
{
if (x>5)
    return true;
else
    return false;
}
int condition2(int x, string C)
{
....
return par1;
}

等等……

然后我需要调用:

bool z = MyFunction(condition1(int x)==true, condition2(int x, string C)==5, DoThisFunction(par1, anotherArguments ...))

c# -传递函数(带参数)作为函数的参数

我想为您的代码建议另一种方法。也许,您可以将需要验证的所有函数保存在一个单独的列表中,并在一个非常简单的循环(foreach)中运行每个方法,在本例中:

  • 代码会非常友好(容易理解)
  • <
  • 更好的可维护性/gh>
  • 你可以检查更少的代码和添加更多的功能(例如,你可以注入一些代码,只是添加另一个Func<>到你的列表<>)

请看下面的例子:

static class Program
{
    private static void Main(string[] args)
    {
        var assertions = new List<Func<object[], bool>>
        {
            Assertion1,
            Assertion2,
            Assertion3
        };
        var yourResult = Assert(assertions, 1, "1", true);
        Console.WriteLine(yourResult); // returns "True" in this case
        Console.ReadLine();
    }
    private static bool Assert(IEnumerable<Func<object[], bool>> assertions, params object[] args)
    {
        // the same as
        // return assertions.Aggregate(true, (current, assertion) => current & assertion(args));
        var result = true;
        foreach (var assertion in assertions)
            result = result & assertion(args);
        return result;
    }
    private static bool Assertion1(params object[] args)
    {
        return Convert.ToInt32(args[0]) == 1;
    }
    private static bool Assertion2(params object[] args)
    {
        return Convert.ToInt32(args[0]) == Convert.ToInt32(args[1]);
    }
    private static bool Assertion3(params object[] args)
    {
        return Convert.ToBoolean(args[2]);
    }
}

这个解决方案似乎对你的问题很通用。

要在执行方法之前检查前提条件,请查看Code Contracts

可以这样使用functor:

private bool MyFunction(Func<int, bool> condition1, Func<int,string,int> condition2, Func<int,string,int, int> doThisFunction, int x, string str)
{
    if (condition1(x) && condition2(x, str) == 5)
        return doThisFunction(x, str, x) == 10;
    return false;
}
然后在代码中像下面这样调用这个函数:

MyFunction(x => x > 5 ? true : false, (x, C) => C.Length == x * 5 ? 5 : C.Length, 
           (x, str, y) =>
           {
               if (x + y > str.Length)
                   return 5;
               else if (x * y > 5)
                   return 10;
               else
                   return 15;
           }, 10, "Csharp");