2017-10-26 13 views
1

次のコードは、元のfunc引数型から別の型に変換するFuncデリゲートを作成しようとします。式ツリーでClosureメソッドとStaticメソッド呼び出しを処理する方法は?

public static Delegate Convert<T1, R>(this Func<T1, R> func, Type argType) 
    { 
     var param = Expression.Parameter(argType); 
     var convertedParam = new Expression[] { Expression.Convert(param, typeof(T1))}; 

     var call = Expression.Convert(
      func.Target == null || func.Target is Closure 
       ? Expression.Call(func.Method, Expression.Constant(func.Target), convertedParam[0])// this path causes the error 
       : Expression.Call(Expression.Constant(func.Target), func.Method, convertedParam), typeof(R)); 

     var delegateType = typeof(Func<,>).MakeGenericType(argType, typeof(R)); 
     var lambda = Expression.Lambda(delegateType, call, param); 
     return lambda.Compile();// BUG: 'MethodInfo must be a runtime MethodInfo object. 

    } 

funcがターゲットとしてクロージャが含まれている場合私の問題は、開始さlambda.Compile()のバグが、私はメソッドが静的であるからだと疑う「メソッド情報は、ランタイムMETHODINFOオブジェクトでなければならない」と述べました。

誰かが私に間違っていることを説明してもらえますか?なぜ?私は明らかにこれを私自身で解決するのに十分な表現を理解していません。

ありがとうございます。

答えて

3

Expression.Invokeに電話すると、直接代理人が呼び出されます。

Expression.Constant(func)を渡します。

+0

ありがとう、私はちょうどそれを試み、それは動作するようです...再びありがとう! –

関連する問題