簡體   English   中英

C#函數作為參數

[英]C# Function as parameter

我需要幫助。 我正在編程,但有問題。

我已經有一個帶有委托的構造函數:

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”,則意味着“成就獲得”,我需要按住它。

尋求幫助

在構造函數中,您可以傳遞如下函數:

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

有關更多信息,請參見使用表達式樹生成動態方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM