反射.NET核心创建lambda表达式



我正在尝试创建一个看起来像

的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.linq.expressions.dll,但未在用户代码中处理

其他信息:类型的变量"提供商" 从范围引用的" system.iserviceProvider",但不是 定义

您创建了两个具有相同名称的不同参数。您应该只致电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();

最新更新