Reflection .NET Core创建Lambda表达式

Ale*_*lex 4 .net c# linq reflection .net-core

我正在尝试创建一个lambda表达式(使用Reflection),看起来像这样

IServiceProvider provider => provider.GetService<TDbContext>()
Run Code Online (Sandbox Code Playgroud)

或者,更具体地说,作为GetService一种扩展方法:

provider => ServiceProviderServiceExtensions.GetService<TDbContext>(provider)
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

 var methodInfo = typeof(ServiceProviderServiceExtensions).
                GetTypeInfo().
                GetMethod("GetService").
                MakeGenericMethod(typeof(TDbContext));

        var lambdaExpression = Expression.Lambda(
            Expression.Call(methodInfo, Expression.Parameter(typeof(IServiceProvider), "provider")),
            Expression.Parameter(typeof(IServiceProvider), "provider")
            );

var compiledLambdaExpression = lambdaExpression.Compile();
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误

System.Linq.Expressions.dll中出现"System.InvalidOperationException"类型的异常,但未在用户代码中处理

附加信息:从范围''引用的'System.IServiceProvider'类型的变量'provider',但它没有定义

Kyl*_*yle 8

您已经创建了两个具有相同名称的不同参数.您应该Expression.Parameter只调用一次并保存结果然后使用它:

var methodInfo = typeof(ServiceProviderServiceExtensions).
            GetTypeInfo().
            GetMethod("GetService").
            MakeGenericMethod(typeof(TDbContext));

var providerParam = Expression.Parameter(typeof(IServiceProvider), "provider");

var lambdaExpression = Expression.Lambda(
        Expression.Call( methodInfo, providerParam ),
        providerParam
        );

var compiledLambdaExpression = lambdaExpression.Compile();
Run Code Online (Sandbox Code Playgroud)