如何使用单个表达式定义编写此代码,但在 C# 中保留整个函数的表达式主体定义

本文关键字:表达式 定义 保留 函数 主体 单个 何使用 代码 但在 | 更新日期: 2023-09-27 18:26:16

void Foo(int a, int b)
=> Bar(a + 1, b + 1)

这可以这样写,以对Inc进行单一定义

void Foo(int a, int b)
{
    Func<int, int> Inc = (x) => x + 1;
    Bar(Inc(a), Inc(b));
}

我正在寻找优雅的方式来保持 Foo 的表达身体定义,但只有一个 lambda 来定义 Inc 表达式。如果我将 Inc 作为单独的函数很容易,但我有兴趣将其保留为 lambda。

如何使用单个表达式定义编写此代码,但在 C# 中保留整个函数的表达式主体定义

这将起作用,但缺点是必须为每个数量的参数编写它,但由于 Func<> 以类似的方式定义,它并没有那么糟糕。

public static class FunctionalExtensions
{
    public static Action<A, A> ArgumentTransform<A>(this Func<A, A> argConverter, Action<A, A> action)
        => (x, y) => action(argConverter(x), argConverter(y));
    public static Func<A, A, R> ArgumentTransform<A, R>(this Func<A, A> argConverter, Func<A, A, R> function)
        => (x, y) => function(argConverter(x), argConverter(y));
}

它可以像这样使用:

void Foo(int a, int b) => new Func<int, int>((x) => x + 1).ArgumentTransform(Bar)(a, b);