Ejemplo n.º 1
0
            private TDel WrapInstanceGenericMethod <TDel>(int typeArgCount, LambdaExpression expr)
                where TDel : class
            {
                var tDelInvoke             = typeof(TDel).GetDelegateInvokeMethod();
                var innerDelegateSignature =
                    tDelInvoke.GetParameters().Skip(typeArgCount).Select(x => x.ParameterType).Append(
                        tDelInvoke.ReturnType).ToArray();
                var innerDelegate = Expression.GetDelegateType(innerDelegateSignature);
                var gi            = Create(innerDelegate, expr.ExtractMethodInfo().GetGenericMethodDefinition());
                var typeParams    =
                    Enumerable.Range(0, typeArgCount).Select(x => Expression.Parameter(typeof(Type), "targ" + x)).ToList
                        ();
                var forwardParams = gi.InArgs.Select(Expression.Parameter).ToList();

                return
                    (Expression.Lambda <TDel>(Expression.Invoke(Expression.Call(Expression.Constant(gi),
                                                                                "GetDelegate",
                                                                                null,
                                                                                Expression.NewArrayInit(typeof(Type), typeParams)),
                                                                forwardParams),
                                              typeParams.Concat(forwardParams)).Compile());
            }