反射 .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 表达式的主要内容,如果未能解决你的问题,请参考以下文章