C# - 将函数(带参数)作为函数

时间:2016-11-07 11:05:50

标签: c# function generics parameters

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

功能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 ...))

3 个答案:

答案 0 :(得分:1)

这个解决方案对您的问题似乎是通用的。

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

答案 1 :(得分:1)

我想为您的代码提出另一种方法。 也许,您可以保留一个单独的列表,其中包含您需要验证的所有函数,并在一个非常简单的循环(foreach)中运行每个方法,在这种情况下:

  • 代码非常友好(易于理解)
  • 更好的可维护性
  • 您可以查看更少的代码并添加更多功能(例如,您可以注入一些代码,只需在列表中添加另一个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]);
    }
}

答案 2 :(得分:0)

您可以使用以下的仿函数:

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