gpt4 book ai didi

c# - 是否有可能动态地创建委托(delegate)给方法 currying 一些参数(并且在没有表达式的编译和 DynamicInvoke 的情况下做到这一点)?

转载 作者:太空宇宙 更新时间:2023-11-03 12:27:15 27 4
gpt4 key购买 nike

是否可以动态地创建方法的委托(delegate)来柯里化(Currying)一些参数(并且不需要表达式的编译和 DynamicInvoke)?

使用 DynamicInvoke 调用柯里化(Currying)看起来像

var methodInfo = typeof(MyTools).GetTypeInfo().GetDeclaredMethod(nameof(MyTools.MyMethod));
var delegateType = typeof(Func<,,>).MakeGenericType(typeof(int), typeof(int), typeof(int));
var @delegate = methodInfo.CreateDelegate(delegateType);
var i2 = 1;
var func = (i1) => { return (int)(@delegate.DynamicInvoke(i1, i2)); };

表达式的 lambda 编译也是可能的,但我在那里跳过它。

在我的设想中,我搜索的 methodInfo.CreateDelegate 需要一些额外的参数,这些参数将接受 i2 ,执行 currying,并返回 Func<,> 类型的委托(delegate)。

附言lambda 编译的代价是由于 JIT_MethodAccessCheck 而产生的运行时开销。当使用 currying 操作时,我搜索应该可以在没有 JIT_MethodAccessCheck 的情况下创建 deleage。

最佳答案

您可以通过为具有不同参数计数的方法创建一系列覆盖来柯里化(Currying)任何函数:

public static class Prelude
{
public static Func<T1, Func<T2, R>> curry<T1, T2, R>(Func<T1, T2, R> f) =>
(T1 a) => (T2 b) => f(a, b);

public static Func<T1, Func<T2, Func<T3, R>>> curry<T1, T2, T3, R>(Func<T1, T2, T3, R> f) =>
(T1 a) => (T2 b) => (T3 c) => f(a, b, c);

public static Func<T1, Func<T2, Func<T3, Func<T4, R>>>> curry<T1, T2, T3, T4, R>(Func<T1, T2, T3, T4, R> f) =>
(T1 a) => (T2 b) => (T3 c) => (T4 d) => f(a, b, c, d);

// ... etc ...
}

接下来,我将为您的 MyTools.MyMethod 定义一个占位符函数。

public static class MyTools
{
public static C MyMethod<A, B, C>(A a, B b) => default(C);
}

然后测试一下:

using static Prelude;

public class CurryTest
{
public void Test()
{
var f = curry<int, int, int>(MyTools.MyMethod<int, int, int>);

var c = f(1)(2);
}
}

我的 functional language extensions library具有 currying 所需的所有覆盖和 partial application

关于c# - 是否有可能动态地创建委托(delegate)给方法 currying 一些参数(并且在没有表达式的编译和 DynamicInvoke 的情况下做到这一点)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44269573/

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