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 ...))
我想为您的代码建议另一种方法。也许,您可以将需要验证的所有函数保存在一个单独的列表中,并在一个非常简单的循环(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");