是否可以动态地为包含某些参数的方法创建委托(并且在没有表达式编译和 DynamicInvoke 的情况下执行此操作)?



是否可以动态地创建授权授予某些参数的方法(并且在没有表达式的编译和DynamicInvoke的情况下进行(?

使用DynamicInvoke调用咖喱看起来像

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编译,这也是可能的,但我跳过了。

在我的Vision MethodInfo.CreatedElegate中,我需要一些其他参数,这些参数可以接受i2,进行咖喱并返回func&lt;,>。

的代表。

P.S。lambda汇编的价格是我们由于jit_methodaccesscheck而拥有的运行时间开销。当使用咖喱操作时,我应该在没有JIT_MethodAccesscheck的情况下创建删除。

您可以通过为具有各种参数计数的方法创建一系列覆盖来求解任何功能:

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);
    }
}

我的功能性语言扩展库具有咖喱和部分应用程序所需的所有替代

最新更新