C#函数作为参数

本文关键字:参数 函数 | 更新日期: 2023-09-27 18:21:51

我需要帮助。我正在制作一个程序,但我遇到了一个问题。

我已经有了一个带有委托的构造函数:

public delegate bool delIsDone(int curState, int needState);
public Progress(delIsDone doneFunction) { ... }

我需要在不创建的情况下通过它:

public bool check() { return true }
Progress p = new Progress(check);

我需要做这样的事情:

  Progress p = new ProgressChecker(bool check(int currentProgress, int needProgress) {
    return currentProgress < needProgress;
  });

其中ProgressChecker是一个具有检查进度的方法的类。

在循环中,我执行这个函数来获得结果。如果函数返回"true",这意味着"成就获得",我需要持有它

Thx帮助

C#函数作为参数

在构造函数中,您可以传入这样的函数:

ProgressChecker(Func<int,int,bool> checker)

这意味着您可以将函数传递到ProgressChecker 的构造函数中

public bool checker (int a, int b)
{
    return a < b;
}
var t = new ProgressChecker(checker);

编辑:

如果您想使用委托,那么在ProgressChecker类中,构造函数必须接受该委托类型:

private delIsDone delIsDone;
public ProgressChecker(delIsDone delIsDone)
{
    this.delIsDone = delIsDone;
}

您可以这样传递一个委托实例:

public class Program
{
    public delegate bool delIsDone(int curState, int needState);
    public static bool checkNumbers(int a, int b)
    {
        return a < b;
    }
    public static void Main(string[] args)
    {
        var t = new ProgressChecker(new delIsDone(checkNumbers)); 
    // OR var t = new ProgressChecker(new delIsDone((a, b) => { return a < b; }));           
    }
}

您也可以创建表达式树,这是我的代码片段(可以轻松转换为您的示例)

        //easy way
        Expression<Action<int>> printExpr = (arg) => Console.WriteLine(arg);
        printExpr.Compile()(10);
        //hard way
        ParameterExpression param = Expression.Parameter(typeof(int), "arg");
        MethodCallExpression methodCall = Expression.Call
            (
                  typeof(Console).GetMethod("WriteLine", new[]
                  {
                      typeof(int)
                  }
             ),
             param
          );
        Expression.Lambda<Action<int>>(methodCall, param).Compile()(10); //execution

更多信息可在使用表达式树生成动态方法中收集