反射 .NET Core 创建 Lambda 表达式

Posted

技术标签:

【中文标题】反射 .NET Core 创建 Lambda 表达式【英文标题】:Reflection .NET Core Create Lambda Expression 【发布时间】:2017-04-22 13:43:21 【问题描述】:

我正在尝试创建一个看起来像这样的 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 但未在用户代码中处理

附加信息:变量 'provider' 类型 从范围“”引用的“System.IServiceProvider”,但不是 定义

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于反射 .NET Core 创建 Lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章

如何优化 .NET Core 中的 lambda 查询表达式 ?

Java反射, 枚举,Lambda表达式

反射枚举和lambda表达式

总结Java中反射+枚举+Lambda表达式

JAVA 反射枚举 Lambda 表达式详解

JAVA 反射枚举 Lambda 表达式详解