使用函数 Func 作为参数的 C# 扩展
C# extension using function Func as parameter
请不要混淆代码,代码是错误的。重点关注下面的粗体问题。
我一直在准备学习函数式编程,所以至少要为它的先决条件做好准备,我一直在学习扩展、函数和 lambda 表达式。
下面的这段代码不起作用我只是认为应该这样编码:
节目:
class Program
{
static void Main(string[] args)
{
int s = 10;
int t = s.CreatedMethod(2, 3); // <-- the one that calls the extension
Console.WriteLine(t.ToString());
Console.ReadLine();
}
static int RegularMethod(int v1, int v2)
{
return v1 * v2; // <-- I also wanted to multiply int 's' like this s*v1*v2
}
}
分机:
public static class Extension
{
public static int CreatedMethod(this int number, Func<int, int, int> fn)
{
// I'm expecting that the code here will read the
// RegularMethod() above
// But I don't know how to pass the parameter of the function being passed
return @fn(param1, param2)// <-- don't know how to code here ??
}
}
如您所见,CreateMethod 扩展了我的整数 's'。我的计划是在上面的 CreateMethod() 中传递两个参数,并将这两个参数乘以 's'
在上面的例子中,答案应该是60。
你能帮我用扩展吗?
这可能是您要找的东西,但将函数作为参数传递没有意义,或者我可能只是遗漏了一些东西。无论如何,它有效:
class Program
{
static void Main(string[] args)
{
int s = 10;
// the function we're passing as a parameter will multiply them
// then return the result
int t = s.CreatedMethod((param1, param2) => param1 * param2);
// or you can use this since the method signature matches:
// int t = s.CreatedMethod(RegularMethod);
Console.WriteLine(t.ToString()); // outputs "60"
Console.ReadLine();
}
static int RegularMethod(int v1, int v2)
{
return v1 * v2; // <-- I also wanted to multiply int 's' like this s*v1*v2
}
}
public static class Extension
{
public static int CreatedMethod(this int number, Func<int, int, int> fn)
{
return number * fn.Invoke(2, 3);
}
}
跟进 OP 的评论:如果您不想对值进行硬编码,则需要将 CreateMethod
的签名更改为:
public static int CreatedMethod(this int number, int val1, int val2, Func<int, int, int> fn)
然后这样调用 Invoke
:
fn.invoke(val1, val2)
扩展可能如下所示:
public static int CreatedMethod(this int number1, int number2, Func<int, int, int> fn) {
fn(number1, number2);
}
然后调用将是:
var s = 10;
var t = s.CreatedMethod(2, RegularMethod).
CreatedMethod(3, RegularMethod);
这将首先使用 10
和 2
调用 RegularMethod
,第二次使用 20
和 3
。
其他方法是使用像
这样的扩展
public static int CreatedMethod(this int number1, int number2, int number3, Func<int, int, int> fn) {
fn(fn(number1, number2), number3);
}
并像
一样打电话
var s = 10;
var t = s.CreatedMethod(2, 3, RegularMethod);
请不要混淆代码,代码是错误的。重点关注下面的粗体问题。
我一直在准备学习函数式编程,所以至少要为它的先决条件做好准备,我一直在学习扩展、函数和 lambda 表达式。
下面的这段代码不起作用我只是认为应该这样编码:
节目:
class Program
{
static void Main(string[] args)
{
int s = 10;
int t = s.CreatedMethod(2, 3); // <-- the one that calls the extension
Console.WriteLine(t.ToString());
Console.ReadLine();
}
static int RegularMethod(int v1, int v2)
{
return v1 * v2; // <-- I also wanted to multiply int 's' like this s*v1*v2
}
}
分机:
public static class Extension
{
public static int CreatedMethod(this int number, Func<int, int, int> fn)
{
// I'm expecting that the code here will read the
// RegularMethod() above
// But I don't know how to pass the parameter of the function being passed
return @fn(param1, param2)// <-- don't know how to code here ??
}
}
如您所见,CreateMethod 扩展了我的整数 's'。我的计划是在上面的 CreateMethod() 中传递两个参数,并将这两个参数乘以 's'
在上面的例子中,答案应该是60。
你能帮我用扩展吗?
这可能是您要找的东西,但将函数作为参数传递没有意义,或者我可能只是遗漏了一些东西。无论如何,它有效:
class Program
{
static void Main(string[] args)
{
int s = 10;
// the function we're passing as a parameter will multiply them
// then return the result
int t = s.CreatedMethod((param1, param2) => param1 * param2);
// or you can use this since the method signature matches:
// int t = s.CreatedMethod(RegularMethod);
Console.WriteLine(t.ToString()); // outputs "60"
Console.ReadLine();
}
static int RegularMethod(int v1, int v2)
{
return v1 * v2; // <-- I also wanted to multiply int 's' like this s*v1*v2
}
}
public static class Extension
{
public static int CreatedMethod(this int number, Func<int, int, int> fn)
{
return number * fn.Invoke(2, 3);
}
}
跟进 OP 的评论:如果您不想对值进行硬编码,则需要将 CreateMethod
的签名更改为:
public static int CreatedMethod(this int number, int val1, int val2, Func<int, int, int> fn)
然后这样调用 Invoke
:
fn.invoke(val1, val2)
扩展可能如下所示:
public static int CreatedMethod(this int number1, int number2, Func<int, int, int> fn) {
fn(number1, number2);
}
然后调用将是:
var s = 10;
var t = s.CreatedMethod(2, RegularMethod).
CreatedMethod(3, RegularMethod);
这将首先使用 10
和 2
调用 RegularMethod
,第二次使用 20
和 3
。
其他方法是使用像
这样的扩展public static int CreatedMethod(this int number1, int number2, int number3, Func<int, int, int> fn) {
fn(fn(number1, number2), number3);
}
并像
一样打电话var s = 10;
var t = s.CreatedMethod(2, 3, RegularMethod);