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 是一个 class 具有检查进度的方法。
在循环中我执行这个函数来得到结果。如果函数 return "true" 这意味着 "Achievement geted" 我需要持有它。
谢谢帮助
在构造函数中你可以像这样传入一个函数:
ProgressChecker(Func<int,int,bool> checker)
这意味着您可以将函数传递给 ProgressChecker
的构造函数
public bool checker (int a, int b)
{
return a < b;
}
var t = new ProgressChecker(checker);
编辑:
如果要使用委托,那么在ProgressChecker
class中,构造函数必须采用该委托类型:
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
收集更多信息
我需要帮助。我正在制作一个程序,但遇到了问题。
我已经有一个带有委托的构造函数:
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 是一个 class 具有检查进度的方法。
在循环中我执行这个函数来得到结果。如果函数 return "true" 这意味着 "Achievement geted" 我需要持有它。
谢谢帮助
在构造函数中你可以像这样传入一个函数:
ProgressChecker(Func<int,int,bool> checker)
这意味着您可以将函数传递给 ProgressChecker
public bool checker (int a, int b)
{
return a < b;
}
var t = new ProgressChecker(checker);
编辑:
如果要使用委托,那么在ProgressChecker
class中,构造函数必须采用该委托类型:
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
收集更多信息