gpt4 book ai didi

使用函数 Func 作为参数的 C# 扩展

转载 作者:行者123 更新时间:2023-11-30 20:35:51 24 4
gpt4 key购买 nike

请不要混淆代码,代码是错误的。专注于下面的粗体问题。

我一直在准备学习函数式编程,至少为它的先决条件做好准备,我一直在学习扩展、函数和 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)

关于使用函数 Func 作为参数的 C# 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37478152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com