2016-12-07 6 views
4

を作成し、私はこのリフレクション.NETのコアは、ラムダ式

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」スコープ 'から参照されていますが、 が定義されていません

答えて

8

同じ名前の2つの異なるパラメータを作成しました。 Expression.Parameterを1回だけ呼び出して結果を保存してから使用してください。

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();