使用函数 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);

这将首先使用 102 调用 RegularMethod,第二次使用 203

其他方法是使用像

这样的扩展
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);