Expression.Compile(),参数超出范围

时间:2015-09-13 14:03:57

标签: c# delegates expression-trees

我一直在搞乱表达树,我遇到了挫折,无法找到原因或如何解决这个问题:

        public static Expression GetExp(object caller, string s)
    {
        var callerType = caller.GetType();
        if (s.Contains('('))
        {
            //We are a method call
            var data = s.Split('.');
            var instance = Expression.Parameter(callerType, "obj");
            var currentExpression = (Expression)instance;
            for (int index = 0; index < data.Length - 1; index++)
            {
                var prop = data[index];
                currentExpression = (Expression.PropertyOrField(currentExpression, prop));
            }
            var expLex = Expression.Lambda(currentExpression, instance);
            var compiled = expLex.Compile();
            var result = compiled.DynamicInvoke(caller);
            var propType = result.GetType();
            var propField = Expression.Parameter(propType, "prop");
            var methodExpression = GetMethod(currentExpression,propType, data[data.Length - 1]);
            //What now?


            var fullExp = Expression.Lambda(methodExpression,instance);
            var fullcompiled = fullExp.Compile();
            var final =fullcompiled.DynamicInvoke(caller);

        }
        return null;
    }



    public static MethodCallExpression GetMethod(Expression callingExp,Type owner, string method)
    {
        //parameters = null
        var start = method.IndexOf('(');
        var end = method.LastIndexOf(')');
        string methodName = method.Substring(0, start);
        var amount = end - start; ;
        var methodInfo = owner.GetMethod(methodName,BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
        if (amount <= 1)
        {
            return Expression.Call(callingExp, methodInfo);
        }
        var parameters = methodInfo.GetParameters().Select(v => Expression.Parameter(v.ParameterType, v.Name)).Cast<Expression>().ToList();
        var ara = parameters.Cast<ParameterExpression>().ToArray();
        var result = Expression.Call(callingExp, methodInfo, Expression.Parameter(typeof(int),"something"));
        var fullExp = Expression.Lambda(result);
        var c = fullExp.Compile();
        return result;
    }

基本上当我在GetMethod调用中调用Compile时,我从Scope中获取了一个Argument。只有当方法有参数时才会发生这种情况,如果方法没有参数,它就可以正常工作。

我做错了什么?

0 个答案:

没有答案