反射在.NET Core中创建Lambda表达式

4

我正在尝试创建一个类似这样的Lambda表达式(使用反射)

IServiceProvider provider => provider.GetService<TDbContext>()

或者更具体地说,因为GetService是一个扩展方法:
provider => ServiceProviderServiceExtensions.GetService<TDbContext>(provider)

这是我的代码:
 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();

我遇到了这个错误

'System.InvalidOperationException'类型的异常在'System.Linq.Expressions.dll'中发生, 但未在用户代码中处理

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

1个回答

9
您已经创建了两个具有相同名称的不同参数。您应该仅调用一次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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接